【发布时间】:2017-07-15 12:20:27
【问题描述】:
我想将一个 ByteArray 变量从我的 Python 程序传递给我用 C 编写的 DLL,以加速一些在 Python 中太慢的特定处理。我浏览了 Web,尝试了结合 byref、cast、memoryviews、addressof 的 Ctypes,但没有任何效果。有没有什么简单的方法可以实现这一点,而无需将我的 ByteArray 复制到其他可以通过的东西中? 这是我想要做的:
/* My C DLL */
__declspec(dllexport) bool FastProc(char *P, int L)
{
/* Do some complex processing on the char buffer */
;
return true;
}
# My Python program
from ctypes import *
def main(argv):
MyData = ByteArray([1,2,3,4,5,6])
dll = CDLL('CHELPER.dll')
dll.FastProc.argtypes = (c_char_p, c_int)
dll.FastProc.restype = c_bool
Result = dll.FastProc(MyData, len(MyData))
print(Result)
但是在将第一个参数 (MyData) 传递给 C 函数时出现类型错误。
是否有任何不需要太多开销的解决方案会浪费我的 C 函数的好处?
奥利维尔
【问题讨论】:
-
什么是
ByteArray?不应该是bytearray(全部小写)吗?你在使用 Python 3 吗? -
是的,它是一个字节数组,抱歉打错了
-
创建一个长度相同的 ctypes 数组类型并将
bytearray传递给它的from_buffer构造函数,例如L = len(MyData);P = (ctypes.c_char * L).from_buffer(MyData);dll.FastProc(P, L). -
是的,感谢 eryksun,from_buffer 将允许 c_char 数组与原始 bytearray 共享其字节。我一回到家就去测试。阅读更多文档,我还发现将我的 C 函数与 Cython 连接是另一种选择。我将尝试这两个选项并比较性能。
-
我确认解决方案有效,并允许我的 C 例程在原始字节数组上就地工作(包括修改)。现在我需要尝试 Python 选项,我认为它更优雅(直接调用函数)和更高效。