python - 将 C 数组转换为 Python 字节

标签 python c++ cython

我正在尝试使用 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/

相关文章:

python - 使用 python 解释器直接运行 cython 扩展?即 "python test.so"

python - FFmpeg/python - 从 shell 运行时命令有效,但从 python 运行时失败

python - 比较两个列表并识别出现差异的字符串位置

模板参数上的 C++ 函数模板重载

c++ - 使用模板时如何从 std::vector 中删除元素?

C++ 重载 >> 运算符

python - 只打包用 Cython 编译的 python 库的二进制编译 .so 文件

python - 使用 cython 创建矩阵的有效方法

显示传递和默认 kwargs 的 python 装饰器

python - 如何在matplotlib中的子图下方添加图例?