标签: pybuffer

在Cython中使用缓冲区API

我正在使用一个C库,它重复调用用户提供的函数指针以获取更多数据.我想以这样的方式,Python实现该回调可以返回任何合理的数据类型写一个用Cython包装一样str,bytearray,内存映射文件等(具体而言,支持缓冲接口).到目前为止我所拥有的是:

from cpython.buffer cimport PyBUF_SIMPLE
from cpython.buffer cimport Py_buffer
from cpython.buffer cimport PyObject_GetBuffer
from cpython.buffer cimport PyBuffer_Release
from libc.string cimport memmove

cdef class _callback:
    cdef public object callback
    cdef public object data

cdef uint16_t GetDataCallback(void * userdata,
                              uint32_t wantlen, unsigned char * data,
                              uint32_t * gotlen):

    cdef Py_buffer gotdata
    box = <_callback> userdata
    gotdata_object = box.callback(box.data, wantlen)
    if not PyObject_CheckBuffer(gotdata_object):
        # sulk
        return 1

    try:
        PyObject_GetBuffer(gotdata_object, &gotdata, PyBUF_SIMPLE)

        if not (0 < gotdata.len <= …
Run Code Online (Sandbox Code Playgroud)

python memory-management cython pybuffer pep3118

21
推荐指数
1
解决办法
2096
查看次数

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

我正在扩展我们的库(支持Python 2.7)中的类以支持PEP 3118,后者已经被反向移植到2.7.

从文档中,我需要初始化tp_as_buffer字段以指向a PyBufferProcs.但是,从2.7的文档中,此结构的描述仅包含旧缓冲区协议的条目.从来源,我收集的是 PyBufferProcs对新协议(一些其他的项目bf_getbufferbf_releasebuffer).

问题仍然存在:

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

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

python python-c-api pybuffer python-extensions pep3118

9
推荐指数
1
解决办法
422
查看次数

关于python中的Buffer接口

我对python中的术语'缓冲接口'很困惑.说"暴露其底层内存结构的python对象"可以用某个例子来解释是什么意思.提前谢谢

python pybuffer python-2.7 python-3.x pep3118

6
推荐指数
1
解决办法
1090
查看次数

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

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

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

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

Py_buffer *buf = (Py_buffer *) malloc(sizeof(*buf));
int r = PyBuffer_FillInfo(buf, NULL, malloc(sizeof(char) * 4), 4, 0, PyBUF_CONTIG);
PyObject *mv = PyMemoryView_FromBuffer(buf);
//Pack the memoryview object into an argument list and call the Python function
for (blah)
  printf("%c\n", *buf->buf++); //this prints the values i set …
Run Code Online (Sandbox Code Playgroud)

python cpython pybuffer pep3118

5
推荐指数
1
解决办法
4432
查看次数