Я все еще новичок в этом виде расширения (хотя у меня хороший опыт в C ++ и Python)
я хотел использовать модуль ctypes для передачи данных в функцию C ++
пример, который работал до сих пор для меня:
файл test.dll
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a, int b) {
return a + b;
}
файл sum_test.py:
from ctypes import cdll
mydll = cdll.LoadLibrary('test.dll')
mydll.sum(5, 3)
результат 8, который работает хорошо …
нота:
Я использую это для разработки Addon (плагина) для blender, данные, которые я передам в функцию C ++, представляют собой огромный массив (Tuple или любой другой тип массива), эти данные будут переданы в GPU для обработки его с OpenCL
в основном рабочий процесс в C ++ передает указатель (который скопирует данные всего массива в графический процессор)
поэтому вопрос таков:
лучший (самый быстрый) способ получить указатель кортежа в C ++ (надеюсь, с объяснением того, что происходит в python и в C ++)
Самый простой способ — сообщить ctypes, что функция берет указатель на массив определенного типа, во многих случаях Python / ctypes выяснит остальное.
libc = CDLL('libc.so.6') # on Debian/Linux
printf = libc.printf
printf.restype = c_int
printf.argtypes = [POINTER(c_char), c_int]
printf('< %08x >', 1234)
Это предполагает, что функция просто возьмет указатель. Если ваша функция занимает, например, ровно пять операций с плавающей запятой, вы можете указать c_float * 5
как в соответствии с типом параметра.
Других решений пока нет …