Запись в новый интерфейс буфера Python

Я реализовал новый Интерфейс буфера Python в C ++ изложен здесь:

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. Итак, теперь мой вопрос: как мне написать и изменить размер этого pyBuffer в C ++? Я могу получить доступ к указателю напрямую и по размеру. Но если это только что созданный буфер, как мне сказать, сколько места мне нужно? Кажется, мне не нужно вызывать какую-либо функцию изменения размера.

Я могу использовать: int result = PyBuffer_FromContiguous(&m_view, const_cast<void*>(data), pySize, 'A');

добавить данные в мой буфер. Но мой буфер уже должен иметь правильный размер, иначе он не запишется. Я не думаю, что это правильный способ использовать его в любом случае.

Cython не вариант.

3

Решение

Вы не должны изменять размер Py_buffer напрямую, так как это просто интерфейс к данным PyObject,

Вместо этого используйте PyByteArray_Resize() (или возможно _PyString_Resize()) на основе PyObject,

2

Другие решения