公开C字符串而不复制到python 3.x代码

bde*_*dew 7 python api python-3.x

我有一个用cython编写的库,它包装了一个C库,我将一些c字符串暴露给python代码.这些字符串很大,而且是静态的(不能释放它们)所以只是从它们那里制作一个python字符串(这就是副本)不是一个选项 - 我得到了OOM错误.

我有代码工作python 2.x目前使用旧的缓冲API,看起来或多或少像:

def get_foo():
     return PyBuffer_FromMemory(c_foo_ptr,c_foo_len)
Run Code Online (Sandbox Code Playgroud)

这对于python 2.x来说是有效的(tm),但是旧的缓冲API在3.x中消失了,我无法弄清楚如何使用新的缓冲API.

我看到PyMemoryView_FromBufferPyBuffer_FillInfo结合起来应该做同样的事情,但PyBuffer_FillInfo想要一个对我来说不存在的对象(它只是一个模块级函数),制作一个虚拟对象并传递它只是给了我一个段错误,所以我想这个对象应该以某种方式支持缓冲区......但它的文档记录在哪里?

进一步尝试使用内存视图,它们根本不会看起来或充当字符串(或字节),因此我必须重写所有的python代码或以某种方式重新创建该功能.

我错过了什么吗?有没有一种简单的方法来替换py3k中的PyBuffer_FromMemory?

注意:我正在使用cython,但这是原始c-api的东西,所以你可以在不涉及cython的情况下回答它.

小智 1

根据此线程, PyBuffer_FillInfo 的第二个参数是可选的。你能传递 NULL 来代替它吗?如果没有,您可以自己创建一个 PyBuffer 实例并填充适当的字段。

  • @bdew 你能分享你的最终结果吗?我正在尝试做同样的事情,但我发现文档没有帮助,新的缓冲区 API 更重量级,到目前为止我所获得的只是内存泄漏和崩溃。顺便说一句,邮件列表链接已失效。 (3认同)