Odpowiedź Chinmaya Kanchi jest doskonała, ale chciałem mieć przykład funkcji, która przekazuje i zwraca zmienne / tablice do kodu C ++. Pomyślałem, że umieściłbym to tutaj na wypadek, gdyby było przydatne dla innych.
Przekazywanie i zwracanie liczby całkowitej
Kod C ++ funkcji, która pobiera liczbę całkowitą i dodaje ją do zwracanej wartości,
extern "C" int add_one(int i)
{
return i+1;
}
Zapisany jako plik test.cpp
, zanotuj wymagany zewnętrzny "C" (można go usunąć dla kodu C). Jest to kompilowane przy użyciu g ++, z argumentami podobnymi do odpowiedzi Chinmay Kanchi,
g++ -shared -o testlib.so -fPIC test.cpp
Kod Pythona wykorzystuje load_library
od numpy.ctypeslib
założenia ścieżki do biblioteki współdzielonej w tym samym katalogu co skrypt Pythona,
import numpy.ctypeslib as ctl
import ctypes
libname = 'testlib.so'
libdir = './'
lib=ctl.load_library(libname, libdir)
py_add_one = lib.add_one
py_add_one.argtypes = [ctypes.c_int]
value = 5
results = py_add_one(value)
print(results)
To wypisuje 6 zgodnie z oczekiwaniami.
Przekazywanie i drukowanie tablicy
Możesz również przekazać tablice w następujący sposób, aby kod C wydrukował element tablicy,
extern "C" void print_array(double* array, int N)
{
for (int i=0; i<N; i++)
cout << i << " " << array[i] << endl;
}
który jest kompilowany jak poprzednio, a importowany w ten sam sposób. Dodatkowy kod Pythona do użycia tej funkcji wyglądałby wtedy:
import numpy as np
py_print_array = lib.print_array
py_print_array.argtypes = [ctl.ndpointer(np.float64,
flags='aligned, c_contiguous'),
ctypes.c_int]
A = np.array([1.4,2.6,3.0], dtype=np.float64)
py_print_array(A, 3)
gdzie określamy tablicę, pierwszy argument do print_array
, jako wskaźnik do tablicy Numpy wyrównanych, ciągłych 64-bitowych pływaków c_, a drugi argument jako liczbę całkowitą, która mówi kodowi C liczbę elementów w tablicy Numpy. To jest następnie drukowane przez kod C w następujący sposób,
1.4
2.6
3.0
>>>
plik importtest.py? Kiedy ludzie wysyłają kod, który ma>>>
w każdym wierszu, oznacza to, że jest on uruchamiany w powłoce interaktywnej. Aby uruchomić go z pliku, usuń>>>
(to jest 3> znaki i spacja), gdziekolwiek się pojawi.