6

数组上的python 文档清楚地指出数组符合缓冲区接口。它甚至建议不要使用 buffer_info() 方法。但是,当我尝试使用 PyObject_GetBuffer() 从 C/C++ 代码中获取 Py_Buffer 或使用 python 的 memoryview 时,我遇到了失败。

例如,在 python 中(我使用 2.7 版):

>>> a = array.array('c')
>>> memoryview(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot make memory view because object does not have the buffer interface

事实上,当我搜索 python 的代码库时,只有 bytearrayobject (bytearray)、memoryobject (memoryview) 和 stringobject (str) 设置了所需的 Py_TPFLAGS_HAVE_NEWBUFFER 标志。据我了解,文档是错误的;数组不支持缓冲区接口。

我可以使用支持缓冲区接口的 bytearray,问题是我需要数组的实用 fromfile() 方法来读取我可以在我的 C/C++ 代码中使用的缓冲区。

是否有替代方法可以让我将文件读入缓冲区并从 C 代码中使用此缓冲区,而不涉及内存副本?(我想处理大的二进制文件,复制是一个不太理想的选择)。

4

2 回答 2

5

memoryview仅适用于支持 Python 3 缓冲区接口的对象。array.array在 Python 3 中可以,但在 Python 2.7 中没有。您可能需要为此提交错误报告。只需使用 use bytearray(或者str如果您以只读方式使用它)。两个都支持memoryview就好了。

于 2011-02-02T19:32:34.400 回答
3

Python 2.6+ 有两种不同的缓冲区接口,就像它有两种不同的类类型一样:经典版和 Python 3 版。

来自Python/C API 参考手册

支持缓冲区接口的两个对象示例是字符串和数组。字符串对象以缓冲区接口的面向字节的形式公开字符内容。数组只能通过旧式缓冲区接口公开其内容。此限制不适用于 Python 3,其中 memoryview 对象也可以从数组构造。

在 Python 2.7 代码中,您可以使用buffer函数处理旧式缓冲区,使用memoryview. Python 3 仅支持后者。

Python 2 C API 中也存在类似的区别。PyObject_GetBuffer用于新的缓冲区接口,PyBuffer_FromObject/PyBuffer_FromReadWriteObject用于旧的缓冲区接口(并且应该适用于数组)。有关更多信息,请参阅上面的链接。

于 2014-05-03T22:46:44.553 回答