我有一个用cython编写的库,它包装了一个C库,我将几个c字符串暴露在python代码中。那些字符串很大,而且是静态的(不能释放它们)所以只是从它们那里制作一个python字符串(这就是副本)不是一个选项 - 我得到了OOM错误。
我的代码适用于目前使用旧缓冲区API的python 2.x,它看起来或多或少像:
def get_foo():
return PyBuffer_FromMemory(c_foo_ptr,c_foo_len)
这对python 2.x起作用(tm),但旧的缓冲区API在3.x中消失了,我无法弄清楚如何使用新的缓冲区。
我看到 PyMemoryView_FromBuffer 和 PyBuffer_FillInfo 组合将会做同样的事情,但 PyBuffer_FillInfo 想要一个不存在的对象对我来说(它只是一个模块级别的函数),制作一个虚拟对象并传递它只是给了我一个段错误,所以我想这个对象应该以某种方式支持缓冲区...但它在哪里被记录?
进一步尝试使用内存视图时,它们根本不会看起来或充当字符串(或字节),因此我必须重写所有的python代码或以某种方式重新创建该功能。
我错过了什么吗?有没有一种简单的方法来替换py3k中的PyBuffer_FromMemory?
注意:我正在使用cython,但这是原始的c-api内容,所以你可以在不涉及cython的情况下回答它。
答案 0 :(得分:1)
根据this thread,PyBuffer_FillInfo的第二个参数是可选的。你能在它的位置传递NULL吗?如果不是,您可以自己创建一个PyBuffer实例并填写相应的字段。
答案 1 :(得分:0)
听起来好像你应该创建自己的custom type并在tp_as_sequence
(以及可能tp_as_buffer
)中实施相应的方法。