【问题标题】:Expose C++ buffer as Python 3 bytes将 C++ 缓冲区公开为 Python 3 个字节
【发布时间】:2014-05-28 16:01:24
【问题描述】:

使用 Boost::Python,有没有办法让 Python 3.2 可以将原始 C++ 缓冲区作为 bytes 对象访问?

very similar question 有一个 Python 2 的答案,但那里描述的 PyBuffer_FromReadWriteMemory 函数在 Python 3 中不再存在。

编辑:感谢 user2167433 的回答,我真正想要的是只读的 memoryview 对象,而不是 bytes 对象(我相信使用 memoryview 可以避免复制缓冲区)。

【问题讨论】:

  • 为什么是bytes 对象?缓冲区是不可变的吗?
  • @delnan 是的,缓冲区是不可变的。

标签: c++ python-3.x boost-python python-3.2


【解决方案1】:

Python > 3 和 Python
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 memoryview memoryview class

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2012-07-17
    • 1970-01-01
    • 2010-09-27
    • 2021-12-18
    相关资源
    最近更新 更多