Python ctypes:如何将 ctypes 数组传递给 DLL?

Posted

技术标签:

【中文标题】Python ctypes:如何将 ctypes 数组传递给 DLL?【英文标题】:Python ctypes: how to pass ctypes array to DLL? 【发布时间】:2018-01-01 00:00:29 【问题描述】:

使用 ctypes 从 Python 调用 dll,我想将 ctypes 数组传递给 dll。这是 Python 代码:

ReturnVec = ctypes.c_float * len(arrA)
t = type(ReturnVec)
hllDll = ctypes.WinDLL(r"C:/Temp2/Test_Project_3B/Std_Math_Formulas.dll")
SimpleTest = hllDll.SimpleTest
SimpleTest.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_float)]
SimpleTest.restype = ctypes.c_void_p
retvar = SimpleTest(ctypes.byref(pvarr),ctypes.c_float(ReturnVec))

最后一行抛出错误:

“TypeError:必须是实数,而不是_ctypes.PyCArrayType。”

变量t 表明它的类型是ctypes.PyCArrayType。变量ReturnVec 表明它的类型是c_floatarray_1000(其中1000 是数组的长度)。

我尝试将其转换为 float:

aq = ctypes.cast(ReturnVec, ctypes.c_float)

但它会返回:

": 类型错误"

我尝试将它转换为指针,我得到了同样的结果:

floatPtr = ctypes.cast(ReturnVec, ctypes.POINTER(ctypes.c_float))

我对此进行了详细研究,关于这个问题有很多线程,但没有一个描述我的情况。

【问题讨论】:

【参考方案1】:

这是我上面问题的答案:

SimpleTest = hllDll.SimpleTest

SimpleTest.argtypes = [ctypes.c_void_p, ctypes.c_void_p] SimpleTest.restype = ctypes.c_int64

retvar = SimpleTest(ctypes.byref(pvarr),ctypes.byref(arrA))

【讨论】:

这不是一个完整的答案。什么是pvarrarrA(问题中也没有定义)?【参考方案2】:

ReturnVec 是一个类型,因此“必须是实数”错误。你需要一个类型的实例:

ReturnVecInstance = ReturnVec()

【讨论】:

以上是关于Python ctypes:如何将 ctypes 数组传递给 DLL?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ctypes 将数组从 C++ 函数返回到 Python

如何通过 ctypes 将(非空)列表从 Python 传递到 C++?

如何使用 ctypes 将 Python 列表转换为 C 数组?

如何使用ctypes,python将字符串参数传递给C++函数

如何将 ctypes 的 c_long 转换为 Python 的 int?

如何编译多个 C++ 文件以将它们与 Python ctypes 一起使用?