问题标签 [pep3118]

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 回答
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 投票
3 回答
2153 浏览

python - 无符号字符*图像到 Python

我能够使用 SWIG 为相机库生成 python 绑定,并且能够使用库的内置函数捕获和保存图像。我正在尝试从相机获取数据为 Python Image Library 格式,该库提供了将相机数据返回为 unsigned char* 的函数。有谁知道如何将 unsigned char* 图像数据转换为我可以在 Python 中使用的某种数据格式?基本上我正在尝试将 unsigned char* 图像数据转换为 Python 图像库格式。

谢谢你。

0 投票
2 回答
3088 浏览

python - 为什么无法从数组对象中获取 Py_buffer?

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

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

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

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

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

0 投票
2 回答
5814 浏览

python - 使用 ctypes 数组作为 numpy 数组时出现 PEP 3118 警告

当我尝试将 ctypes 数组用作 numpy 数组时,我收到以下警告消息:

不过,代码似乎正在运行。忽略这个警告是个坏主意吗?

背景:我正在调用一个实时生成数据的 C DLL。我需要向 DLL 传递一系列缓冲区来保存数据。在等待下一个缓冲区填充时,我想用 numpy 处理最新的缓冲区并保存结果。我正在使用上面的代码生成缓冲区,一切似乎都在工作,但我不想在地毯下扫除一个重要问题。

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 投票
2 回答
1347 浏览

python - 新型 python 缓冲区协议和 numpy 数组

我正在尝试为我的商业图像处理库的 python 绑定编写一个快速的非复制接口。我实现了根据 memoryview() 看起来不错的新型缓冲区 api 协议:

我不明白为什么 numpy 没有捕捉到这个接口?

我是在做错什么,还是我应该求助于使用 numpy 数组接口,虽然它复制了数据,但它仍然有效?

请注意,我使用的是 python 2.7