1

编辑:在重新阅读我原来的问题后,我很快意识到它的措辞非常糟糕,模棱两可,而且太混乱而无法得到一个体面的答案。这就是我在午休结束时匆忙提出问题的结果。希望这会更清楚:

我正在尝试将一个简单的 C 结构作为 PyBuffer 公开给 Python (3.x),以便从中检索 MemoryView。我要公开的结构与此类似:

struct ImageBuffer {
    void* bytes;
    int row_count;
    int bytes_per_row;
};

我希望允许脚本编写者像这样访问数据:

img_buffer = img.get_buffer()
img_buffer[1::4] = 255 # Set every Red component to full intensity

不幸的是,关于这些结构的 C API 的现有文档非常稀疏,在某些地方自相矛盾,在其他地方完全错误(记录的函数签名与标题中的签名不匹配,等等)因此我没有一个很好的关于如何最好地揭露这一点的想法。另外,我想避免包含第三方库来实现应该是核心库一部分的功能,但我觉得 PyBuffer 功能仍然相当不成熟,也许像 NumPy 这样的东西会是更好的选择。

有人对此有什么建议吗?

4

1 回答 1

1

此处描述了要实现的一组方法,以便您的扩展类型支持缓冲区协议:http: //docs.python.org/3.1/c-api/typeobj.html#buffer-object-structures

我承认文档非常粗糙,所以我能给出的最佳建议是从 C 类型的缓冲区 API 的现有实现开始,例如官方 Python 源代码中的 bytesobject.c 或 bytearrayobject.c。

但是,请注意,缓冲区协议不允许访问高级符号,例如您引用的那个:img_buffer[1::4] = 255不适用于 memoryview 对象。

编辑:更准确地说,内存视图支持某些类型的切片分配,但不是全部。此外,它们还不够“聪明”,无法理解将 255 分配给切片实际上意味着您希望重复字节值。例子:

>>> b = 字节数组(b“abcd”)
>>> m = 内存视图(b)
>>> m[0:2] = b"xy"
>>> 乙
字节数组(b'xycd')
>>> m[0:2] = 255
回溯(最近一次通话最后):
  文件“”,第 1 行,在
TypeError: 'int' 不支持缓冲区接口
>>> m[0:2] = b"x"
回溯(最近一次通话最后):
  文件“”,第 1 行,在
ValueError:无法修改 memoryview 对象的大小
>>> m[0::2] = b"xy"
回溯(最近一次通话最后):
  文件“”,第 1 行,在
未实现错误
于 2009-12-27T01:29:55.907 回答