将多维数组从Python传递到DLL

时间:2018-02-27 12:50:53

标签: python arrays dll

我在DLL中有这个功能。

int triangle_in_bb_check_int(float* p_bb1, float* p_bb2, float** p_vertices)

然后我在Python中有这个代码,我填充了一些数组并尝试将它们传递给这个DLL函数(注意我不知道在第3个参数中放什么)。

bbbox1 = [0 for x in range(3)] 
bbbox2 = [0 for x in range(3)] 
triangle_vertex = [[0 for x in range(3)] for y in range(3)] 

#... populate the data above with floats

mydll = windll.LoadLibrary("GA_Tools.dll")
mydll.restype = c_int
mydll.triangle_in_bb_check_int.argtypes = [POINTER(c_float), POINTER(c_float), ????]
mydll.triangle_in_bb_check_int(bbbox1, bbbox2, triangle_vertex) 

如何正确地将多维数组 triangle_vertex 传递给DLL函数?

1 个答案:

答案 0 :(得分:0)

您可以使用此功能转换列表:

import ctypes as ct

def float_list(lst):
    if isinstance(lst[0], list):
        data = [float_list(row) for row in lst]
        return (ct.POINTER(ct.c_float) * len(lst))(*data)
    return (ct.c_float * len(lst))(*lst)

这仅适用于传递列表。您无法从C函数内部更改其内容。

argtypes中,您只需添加type(triangle_vertex)

编辑:如何使用:

from ctypes import *

# Create and fill your lists

def float_list(lst):
    if isinstance(lst[0], list):
        data = [float_list(row) for row in lst]
        return (POINTER(c_float) * len(lst))(*data)
    return (c_float * len(lst))(*lst)

arg1 = float_list(bbbox1)
arg2 = float_list(bbbox2)
arg3 = float_list(triangle_vertex)

mydll = windll.LoadLibrary("GA_Tools.dll")
mydll.restype = c_int
mydll.triangle_in_bb_check_int.argtypes = [type(arg1), type(arg2), type(arg3)]
result = mydll.triangle_in_bb_check_int(arg1, arg2, arg3)

该函数将1d列表转换为c_float_Array对象(在C中可以称为单个指针),将2d列表转换为LP_c_float_Array(可以称为双指针)