Оборачивая C ++ DLL в Python, используя ctypes
, я пытаюсь передать двумерные np.array
целых чисел в обернутую функцию в DLL, которая представляет собой массив значений типа double в C ++.
Код ниже:
# create numpy array of int
np_array = np.array([[1503, 0.15],
[1504, 0.14],
[1505, 0.13],
[1506, 0.12]])
# C++ function in DLL wrapped in Python
def fn(double, np_array):
# import DLL
my_dll = CDLL('my_dll.dll')
# create pointer: array of double pointer based on m by n numpy array
array_of_double_pointer = POINTER(c_double * np_array.shape[1] * np_array.shape[0])
# convert np.array to ctypes array object:
c_np_array = np.ctypeslib.as_ctypes(np_array)
# set argument and return types
my_dll.fn.argtypes = [c_double, array_of_double_pointer]
my_dll.fn.restype = c_double
result = my_dll.fn(double, c_np_array)
return result
Что выдает ошибку:
OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF
Когда print(array_of_double_pointer)
:
<class '__main__.LP_c_double_Array_2_Array_4'>
Когда print(c_np_array)
:
<__main__.c_double_Array_2_Array_4 object at 0x00000000037B8DC8>
Я также попробовал следующее решение, с которым я столкнулся на SO, для преобразования массива np.array' to
ctypes и создания указателя массива ctypes
:
c_array= np.ascontiguousarray(np_array, dtype=int)
array_of_double_pointer = c_array.ctypes.data_as(POINTER(c_double))
, котороебросает TypeError
:
TypeError: item 2 in _argtypes_ has no from_param method