问题标签 [pybuffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1605 浏览

python - 从 C 结构创建 PyBuffer

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

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

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

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

有人对此有什么建议吗?

0 投票
2 回答
1463 浏览

python - 从 C 访问 PyBuffer 的内容

我在 python 中创建了一个缓冲区对象,如下所示:

我现在byte_stream通过 SWIG 作为参数传递给 C 函数。我有一个用于转换数据的类型图,如下所示:

我尝试了一些不同的东西,错误无法获取我的 byte_stream 的实际内容/值。如何转换或访问我byte_stream使用 C API 的内容?有许多不同的方法可以将 C 数据转换为缓冲区,但我找不到相反的方法。我曾尝试在 gcb 中查看此对象,但无论是它还是它指向包含我的数据的值都没有。

(我使用缓冲区是因为我想避免在从文件中读取数据时将数据转换为字符串的开销)我在 Linux 上使用 python 2.6。

-- 谢谢帕维尔

0 投票
1 回答
952 浏览

python - 分配到 Python 3.x 缓冲区中 itemsize > 1

我正在尝试通过 Python 3.x 缓冲区接口公开图像像素信息的缓冲区(32 位 RGBA)。经过相当多的玩耍,我能够像这样工作:

在 python 中,我可以像这样玩它:

这非常有效。但是,如果我可以使用完整的像素值(int,4 字节)而不是单个字节,那就太好了,所以我修改了缓冲区获取,如下所示:

这实际上返回了数据,我可以正确读取它,但是现在任何尝试为其赋值的尝试都失败了!

在第 1 种情况下,错误告诉我'int' does not support the buffer interface,这是一种耻辱,有点令人困惑(我确实指定缓冲区格式是“I”毕竟),但我可以处理。但是,如果第 2 和第 3 种情况变得非常奇怪:两种情况都给我一个 TypeError 读数(显然,我的图像类型mismatching item sizes for "my.Image" and "bytes"在哪里)my.Image

这让我很困惑,因为我传入的数据显然与我从该元素中得到的数据大小相同。如果 itemsize 大于 1,似乎缓冲区只是停止允许分配。当然,此接口的文档非常稀疏,并且仔细阅读 python 代码并没有真正给出任何使用示例,所以我相当卡住。我是否遗漏了一些说明“当 itemsize > 1 时缓冲区基本上无用”的文档片段,我是否做错了我看不到的事情,或者这是 Python 中的错误?(针对 3.1.1 进行测试)

感谢您对这个(公认的高级)问题提供的任何见解!

0 投票
1 回答
4764 浏览

python - 使用具有不同项目大小的 Py_buffer 和 PyMemoryView_FromBuffer

这个问题与我之前提出的问题有关。如果有人感兴趣,那就是这个基本上,我想做的是使用Py_buffer包装在memoryview-object 中的 C 数组向 Python 公开。我已经使用它来工作PyBuffer_FillInfo(工作=我可以在 Python 中操作数据并将其写入 C 中的标准输出),但是如果我尝试滚动我自己的缓冲区,我会在 C 函数返回后得到一个段错误。

我需要创建自己的缓冲区,因为 PyBuffer_FillInfo 假定格式为 char,使 itemsize 字段为 1。我需要能够提供大小为 1、2、4 和 8 的项目。

一些代码,这是一个工作示例:

查看PyBuffer_FillInfo非常简单的实现,我推出了自己的函数以提供自定义项目大小:

我如何使用它:

使用我自己的缓冲区对象的结果是C函数返回后的段错误。我真的不明白为什么会发生这种情况。非常感激任何的帮助。

编辑 根据这个我之前没找到的问题,itemsize > 1 可能根本不被支持。这使得这个问题更加有趣。也许我可以使用PyBuffer_FillInfo足够大的内存块来保存我想要的东西(例如 32 个 C 浮点数)。在这种情况下,问题更多是关于如何将 Python 浮点数分配给memoryviewPython 函数中的对象。提问提问。

0 投票
1 回答
2390 浏览

python - 在 Cython 中使用缓冲区 API

我正在使用一个 C 库,该库重复调用用户提供的函数指针以获取更多数据。我想编写一个 Cython 包装器,使得该回调的 Python 实现可以返回任何合理的数据类型,如strbytearray、内存映射文件等(特别是支持Buffer 接口)。到目前为止我所拥有的是:

编写的代码会产生等效的 C 代码,但看起来像这样:

生成的 C 代码看起来像我认为它应该做的;但这似乎是不必要地在 Python API 中挖掘。Cython 是否提供更好的语法来实现此效果?

0 投票
1 回答
1446 浏览

python - 关于python中的Buffer接口

我对python中的“缓冲区接口”一词感到很困惑。有人可以用一个例子来解释“一个暴露其底层内存结构的python对象”是什么意思。提前致谢

0 投票
1 回答
496 浏览

python - 当类实现 PEP 3118 时 Python 2.7 中 PyBufferProcs 的定义

我正在扩展我们库中的类(支持 Python 2.7)以支持PEP 3118,它已向后移植到 2.7。

从文档中,我需要初始化该tp_as_buffer字段以指向一个PyBufferProcs. 但是,从 2.7 的文档中,该结构的描述仅包含旧缓冲区协议的条目。从消息来源中,我收集PyBufferProcs新协议(bf_getbufferbf_releasebuffer)的一些附加条目。

问题仍然存在:

  • 我必须做一些特别的事情来告诉 Python 这些新条目是有效的吗?

  • 我必须填写旧协议的条目吗?(例如,2.7 的文档说,它bf_getsegcount 可能不为空。但如果我支持 PEP 3118,则不应使用此条目。)

0 投票
1 回答
256 浏览

python - Py_buffer 在 2.x 中的“多维数组”有什么用?

http://docs.python.org/2/c-api/buffer.html

诠释

内存表示为多维数组的维数。如果为 0,则步幅和子偏移量必须为 NULL。

这在现实世界中的用途是什么?它是否用于分散聚集矢量缓冲区?

0 投票
1 回答
697 浏览

python - 写入新的 Python 缓冲区接口

我已经在此处概述的 C++ 中实现了新的 python 缓冲区接口:

https://docs.python.org/2/c-api/buffer.html

我已经实现了我的 Py_buffer 结构并填写了它:

我正在用 Python 创建我的 Python 缓冲区类并将其交给 C++。我得到了一个 pyObject 和我的 Py_Buffer。所以现在我的问题是,我应该如何在 C++ 中编写和调整这个 pyBuffer 的大小?我可以直接访问指针和大小。但是,如果它是一个新创建的缓冲区,我如何告诉它我需要多少空间?似乎没有任何类型的调整大小功能可供我调用。

我可以用:int result = PyBuffer_FromContiguous(&m_view, const_cast<void*>(data), pySize, 'A');

将数据添加到我的缓冲区。但是我的缓冲区必须已经具有正确的大小,否则它不会写入。我不认为这是使用它的正确方法。

Cython 不是一种选择。

0 投票
1 回答
704 浏览

python - 在 Python 中将二进制数据从文件加载到缓冲区中

我有一组 640x480 的图像。我正在通过 Matlab 将这些图像转换为二进制文件格式……现在,我需要将每个二进制文件加载到 Python 中的缓冲区中,然后从该缓冲区中读取数据。任何人都可以帮助我如何做到这一点,或建议一个链接?-谢谢。