2011-02-02 42 views
6

python documentation on array明确指出,阵列符合缓冲区接口。它甚至建议不要使用buffer_info()方法。但是,当我尝试从PyObject_GetBuffer()从C/C++代码获取Py_Buffer或使用python的memoryview时,我得到一个失败。为什么不能从数组对象中获取Py_buffer?

例如,在蟒蛇(我用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(字节阵列),memoryobject(memoryview)和stringobject(STR)有所需的Py_TPFLAGS_HAVE_NEWBUFFER标志设置在它们上面。据我了解,文件是错误的; 数组不支持缓冲区接口。

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

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

回答

3

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

+0

同意,正如我在我的问题中所说的。但是... bytearray没有方便的fromfile方法。我想我可以使用字符串对象来表示我的二进制数据,但知道缓冲区(如bytearray)可以从文件中填充扩展我的选项。如果我可以使用另一种缓冲区类型,还有一个字符串的unicode转角情况会被消除。 – David 2011-02-02 20:17:49

2

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

Python/C API Reference Manual:支持缓冲器接口对象的

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

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

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

相关问题