【发布时间】:2011-02-16 11:33:01
【问题描述】:
我有一个用 cython 编写的库,它包装了一个 C 库,我将一些 c 字符串公开到 python 代码中。这些字符串很大,而且是静态的(不能解除分配),所以不能只从它们中创建一个 python 字符串(复制)——我会遇到 OOM 错误。
我的代码适用于当前使用旧缓冲区 API 的 python 2.x,它看起来或多或少类似于:
def get_foo():
return PyBuffer_FromMemory(c_foo_ptr,c_foo_len)
这仅适用于 (tm) python 2.x,但旧的缓冲区 API 在 3.x 中消失了,我不知道如何使用新的。
我看到有 PyMemoryView_FromBuffer 和 PyBuffer_FillInfo 组合起来应该会做同样的事情,但是 PyBuffer_FillInfo 想要一个不存在的对象对我来说(它只是一个模块级函数),制作一个虚拟对象并传递它只会给我一个段错误,所以我猜这个对象应该以某种方式支持缓冲区......但是它记录在哪里?
除了尝试内存视图之外,它们看起来或充当字符串(或字节),所以我将不得不重写我所有的 python 代码或以某种方式重新创建该功能。
我错过了什么吗?有没有一种简单的方法来替换py3k中的PyBuffer_FromMemory?
注意:我使用的是 cython,但这是原始的 c-api 东西,所以你可以在不涉及 cython 的情况下回答。
【问题讨论】:
标签: python api python-3.x