正在写入新的Python缓冲区接口

Writing to new Python buffer interface

本文关键字:Python 缓冲区 接口      更新时间:2023-10-16

我已经在C++中实现了新的python缓冲区接口,如下所示:

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

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

template<typename T>
static int getbuffer(PyObject *obj, Py_buffer *view, int flags) 
{
    flags;
    static const Py_ssize_t suboffsets[1] = { 0};
    view->buf           = (void*)(_Cast<T>(obj)->getbuffer());
    view->obj           = NULL;
    view->len           = _Cast<T>(obj)->getbuffersize();
    view->itemsize      = 1;
    view->readonly      = _Cast<T>(obj)->getreadonly();
    view->ndim          = 0;
    view->format        = NULL;
    view->shape         = NULL;
    view->strides       = NULL;
    view->suboffsets    = NULL;
    view->internal      = NULL;
    return 0;
}

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

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

将数据添加到我的缓冲区。但是我的缓冲区必须已经有了正确的大小,否则就无法写入。无论如何,我认为这不是正确的使用方式。

Cython不是一种选择。

您不应该直接调整Py_buffer的大小,因为它只是PyObject数据的接口

相反,在底层PyObject上使用PyByteArray_Resize()(或可能使用_PyString_Resize())。