写入新的 Python 缓冲区接口
Writing to new Python buffer interface
我已经在此处概述的 C++ 中实现了 new 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 缓冲区 class 并将其交给 C++。我得到了一个 pyObject 和我的 Py_Buffer。 所以现在我的问题是,我应该如何在 C++ 中编写和调整此 pyBuffer 的大小?我可以直接访问指针和大小。但是,如果它是一个新创建的缓冲区,我该如何告诉它我需要多少 space?似乎没有任何类型的调整大小功能可供我调用。
我可以使用:int result = PyBuffer_FromContiguous(&m_view, const_cast<void*>(data), pySize, 'A');
将数据添加到我的缓冲区。但是我的缓冲区必须已经具有正确的大小,否则它不会写入。无论如何,我认为这不是使用它的正确方法。
Cython 不是一个选项。
您不应该直接调整 Py_buffer
的大小,因为它只是 接口 到 PyObject
.
的数据
相反,在基础 PyObject
.
上使用 PyByteArray_Resize()
(或可能 _PyString_Resize()
)
我已经在此处概述的 C++ 中实现了 new 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 缓冲区 class 并将其交给 C++。我得到了一个 pyObject 和我的 Py_Buffer。 所以现在我的问题是,我应该如何在 C++ 中编写和调整此 pyBuffer 的大小?我可以直接访问指针和大小。但是,如果它是一个新创建的缓冲区,我该如何告诉它我需要多少 space?似乎没有任何类型的调整大小功能可供我调用。
我可以使用:int result = PyBuffer_FromContiguous(&m_view, const_cast<void*>(data), pySize, 'A');
将数据添加到我的缓冲区。但是我的缓冲区必须已经具有正确的大小,否则它不会写入。无论如何,我认为这不是使用它的正确方法。
Cython 不是一个选项。
您不应该直接调整 Py_buffer
的大小,因为它只是 接口 到 PyObject
.
相反,在基础 PyObject
.
PyByteArray_Resize()
(或可能 _PyString_Resize()
)