3

我已经在此处概述的 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 不是一种选择。

4

1 回答 1

2

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

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

于 2015-04-14T20:54:44.210 回答