Ответ Чинмая Канчи превосходен, но мне нужен пример функции, которая передает и возвращает переменные / массивы в код C ++. Я хотел бы включить его здесь, если он будет полезен другим.
Передача и возврат целого числа
Код C ++ для функции, которая принимает целое число и добавляет единицу к возвращаемому значению,
extern "C" int add_one(int i)
{
return i+1;
}
Сохраняется как файл test.cpp
, обратите внимание на обязательный внешний "C" (его можно удалить для кода C). Это скомпилировано с использованием g ++ с аргументами, аналогичными ответу Чинмая Канчи,
g++ -shared -o testlib.so -fPIC test.cpp
Кодовый Python использует load_library
от numpy.ctypeslib
предполагающего пути к разделяемой библиотеке в том же каталоге, что и сценарий Python,
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)
Это напечатает 6, как и ожидалось.
Передача и печать массива
Вы также можете передавать массивы следующим образом, чтобы код C печатал элемент массива,
extern "C" void print_array(double* array, int N)
{
for (int i=0; i<N; i++)
cout << i << " " << array[i] << endl;
}
который компилируется, как и раньше, и импортируется таким же образом. Дополнительный код Python для использования этой функции будет таким:
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)
где мы указываем массив, первый аргумент print_array
в качестве указателя на массив Numpy выровненных, c_contiguous 64-битных чисел с плавающей запятой, а второй аргумент как целое число, которое сообщает коду C количество элементов в массиве Numpy. Затем это печатается кодом C следующим образом:
1.4
2.6
3.0
>>>
в importtest.py? Когда люди публикуют код, который есть>>>
в каждой строке, это означает, что он выполняется в интерактивной оболочке. Чтобы запустить его из файла, удалите>>>
(это 3 знака> и пробел) везде, где он появляется.