我正在尝试使用 Cython 在 python3 环境中运行 C++ 库。 当我尝试像这样将 int 数组返回给 python 时:
def readBytes(self, length):
cdef int *buffer = []
self.stream.read(buffer, length)
return buffer
我得到了错误
return buffer
^
Cannot convert 'int *' to Python object
附言如果我使用,我不会收到错误
cdef char *buffer = ''
最佳答案
看起来 stream.read()
分配了 buffer
指向的内存。如果是这种情况,则无法将分配在 C++ 空间中的 python 空间数据返回。你应该:
1) 创建一个 python 对象,或者一个 numpy
数组,如果你愿意的话,在 python/cython 代码中
2) 将数据从 *buffer
指向的已分配内存复制到在 python 空间中分配的新 Shiny python 对象。然后您可以返回此对象。
这是必要的,因为 python 无法以任何方式处理分配在 C
空间中的内存,而你的 C
代码分配的内存正在泄漏,即它不会被释放。
现在您还询问了为什么使用 cdef char *buffer = ''
没有收到错误。在后一种情况下,cython 识别出 buffer
指向一个字符串,并自动生成一个新的 python 对象,其内容由 buffer
指向。 ipython
示例如下:
%%cython
def ReturnThisString():
cdef char *buffer = 'foobar'
return buffer
print ReturnThisString() #this outputs 'foobar'
请注意,buffer
是由堆栈中的 C
编译器初始化的,并且不能保证当您从 python 中使用此函数时,字符串仍会在那里内存位置。但是,当 cython 运行 return 语句时,它会自动从您的 char *
指针初始化 python 字符串。 (在 python 3 中,我猜它被转换为 bytes
正如@Veedrac 所说,但这是一个小问题)。在第二种情况下,python 对象的创建和复制操作被隐藏并由 cython
处理,但它仍然存在。
关于python - 将 C 数组转换为 Python 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24207322/