передача массива python в функцию c ++ с использованием ctypes

Я все еще новичок в этом виде расширения (хотя у меня хороший опыт в 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 ++)

1

Решение

Самый простой способ — сообщить 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 как в соответствии с типом параметра.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector