使用 ctypes 从 python 到 c++ 的数据传输

Posted

技术标签:

【中文标题】使用 ctypes 从 python 到 c++ 的数据传输【英文标题】:data transmission from python to c++ using ctypes 【发布时间】:2013-01-24 21:03:05 【问题描述】:

我有 c++ 库,其中的函数是从 python 端调用的。其中一个函数获取一个数组指针,该数组在 python 端具有 [0:255] 中的值并定义为

 seq1=numpy.array(image,dtype=numpy.uint8).flatten()
 seq=numpy.zeros((w*h*3),dtype=numpy.uint8)

函数调用如下

myCppFunction(ctypes.c_void_p(seq.ctypes.data),
                     ctypes.c_void_p(seq1.ctypes.data), 
...)

在 C++ 端,函数定义为

void myCppFunction(ushort *seq, ushort *sequence1, ...)

当我简单地将在 C++ 端收到的内容打印为 seq、sequence1 时,我得到的值远高于无符号短范围,并且零序列没有用零填充。 编译运行良好,但实际运行会导致分段错误。 我哪里错了?

【问题讨论】:

您的第一个问题几乎可以肯定是@WarrenWeckesser 指出的,您将一个 1 字节值的数组视为 2 字节值。但最重要的是,请注意ctypes.data“可能包含未对齐的数据,或者不按正确的字节顺序......甚至可能不可写。”换句话说,即使它是一个uint16 数组,你也不能不检查任何东西就将它传递给ushort * 【参考方案1】:

ushort 是 2 个字节,numpy.uint8 是 1 个字节。

【讨论】:

@Jaime:当然会。想象一个非常简单的 2x2 图像。所以,seq.ctypes.data 是一个包含四个 uint8 值的数组:[00, 00, 00, 00](十六进制)。当您将其解释为包含四个 ushort 值的数组时,它就是 [0000, 0000, <random garbage>, <random garbage>]。随机垃圾是堆上的下一个垃圾,很容易成为非零值。 (或者,当然,它可以超过分配区域的末尾和段错误。) 第一个 (w*h*3)/2 个值是否为零? @abanert 是的,我完全同意。我表达得很糟糕的观点是,您仍然应该看到 一些 零。 您对字节不匹配是正确的,我必须在 unsigned char 上更改 ushort(图像对应于 numpy.uint8,因此必须保留)。谢谢

以上是关于使用 ctypes 从 python 到 c++ 的数据传输的主要内容,如果未能解决你的问题,请参考以下文章

使用 ctypes 将数组从 Python 传递到 C++,无法完全处理它

使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?

使用 ctypes 将 (uint8) NumPy 数组从 python 传递到 c++

如何使用 ctypes 将此 Python 对象移动到 C++ 中?

WindowsError:异常:使用从 C++ 到 Python 的 ctypes 创建 DLL 时出现访问冲突或 Windows 错误 193

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