如何使用Boost :: Python公开原始字节缓冲区?

时间:2013-04-26 09:01:15

标签: python boost boost-python bytebuffer

我有第三方C ++库,其中一些类方法使用原始字节缓冲区。我不太确定如何用它处理Boost :: Python。

C ++库头类似于:

class CSomeClass
{
  public:
      int load( unsigned char *& pInBufferData, int & iInBufferSize );
      int save( unsigned char *& pOutBufferData, int & iOutBufferSize );
}

坚持使用Boost :: Python代码......

class_<CSomeClass>("CSomeClass", init<>())
    .def("load", &CSomeClass::load, (args(/* what do I put here??? */)))
    .def("save", &CSomeClass::save, (args(/* what do I put here??? */)))

如何将这些原始缓冲区包装在Python中作为原始字符串公开?

1 个答案:

答案 0 :(得分:9)

您必须自己编写绑定上的函数,这些函数将从该数据返回Py_buffer对象,允许您以只读(使用PyBuffer_FromMemory)或读写(使用{ {1}})你从Python预先分配的C / C ++内存。

这就是它的样子(反馈最受欢迎):

PyBuffer_FromReadWriteMemory

稍后,当您绑定#include <boost/python.hpp> using namespace boost::python; //I'm assuming your buffer data is allocated from CSomeClass::load() //it should return the allocated size in the second argument static object csomeclass_load(CSomeClass& self) { unsigned char* buffer; int size; self.load(buffer, size); //now you wrap that as buffer PyObject* py_buf = PyBuffer_FromReadWriteMemory(buffer, size); object retval = object(handle<>(py_buf)); return retval; } static int csomeclass_save(CSomeClass& self, object buffer) { PyObject* py_buffer = buffer.ptr(); if (!PyBuffer_Check(py_buffer)) { //raise TypeError using standard boost::python mechanisms } //you can also write checks here for length, verify the //buffer is memory-contiguous, etc. unsigned char* cxx_buf = (unsigned char*)py_buffer.buf; int size = (int)py_buffer.len; return self.save(cxx_buf, size); } 时,请使用上面的静态函数而不是方法CSomeClassload

save

这对我来说看起来像pythonic。