Я реализовал новый Интерфейс буфера 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 не вариант.
Вы не должны изменять размер Py_buffer
напрямую, так как это просто интерфейс к данным PyObject
,
Вместо этого используйте PyByteArray_Resize()
(или возможно _PyString_Resize()
) на основе PyObject
,