将C++缓冲区公开为Python 3字节

Expose C++ buffer as Python 3 bytes

本文关键字:Python 3字节 C++ 缓冲区      更新时间:2023-10-16

使用Boost::Python,是否有方法使原始C++缓冲区作为bytes对象可供Python 3.2访问?

对于一个非常相似的问题,Python 2中有一个答案,但其中描述的PyBuffer_FromReadWriteMemory函数在Python 3中已不存在。

编辑:多亏了user2167433的回答,我真正想要的是只读内存视图对象,而不是bytes对象(使用memoryview可以避免复制我认为的缓冲区)。

Python>3和Python<=3.2:

Py_buffer buffer;
int res = PyBuffer_FillInfo(&buffer, 0, data, dataSize, true, PyBUF_CONTIG_RO);
if (res == -1) {
    PyErr_Print();
    exit(EXIT_FAILURE);
}
boost::python::object memoryView(boost::python::handle<>(PyMemoryView_FromBuffer(&buffer)))

Python>=3.3:

我知道的最好的方法是使用PyMemoryView_FromMemory:

boost::python::object memoryView(boost::python::handle<>(PyMemoryView_FromMemory(data, dataSize, PyBUF_READ)));

memoryview是Python访问支持缓冲区接口的对象的方法。

C API内存视图内存视图类