我正在使用一个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 2.7)中的类以支持PEP 3118,后者已经被反向移植到2.7.
从文档中,我需要初始化tp_as_buffer
字段以指向a PyBufferProcs
.但是,从2.7的文档中,此结构的描述仅包含旧缓冲区协议的条目.从来源,我收集的是
PyBufferProcs
对新协议(一些其他的项目bf_getbuffer
和bf_releasebuffer
).
问题仍然存在:
我是否必须做一些特别的事情来告诉Python这些新条目是否有效?
我是否必须填写旧协议的条目?(例如,2.7的文档说明bf_getsegcount
可能不为空.但如果我支持PEP 3118,则不应使用此条目.)
我对python中的术语'缓冲接口'很困惑.说"暴露其底层内存结构的python对象"可以用某个例子来解释是什么意思.提前谢谢
这个问题与我之前提出的一个问题有关。即这一项,如果有人有兴趣。基本上,我想要做的是使用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) pep3118 ×4
pybuffer ×4
python ×4
cpython ×1
cython ×1
python-2.7 ×1
python-3.x ×1
python-c-api ×1