Запись в новый интерфейс буфера 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 не вариант.

1 ответ

Решение

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

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

Другие вопросы по тегам