您必须自己在绑定上编写函数,该函数将返回py_buffer http://docs.python.org/2/c-api/buffer.html?highlight=buffer#buffers-and-memoryview-objects来自该数据的对象,允许您只读(使用PyBuffer_FromMemory
)或读写(使用PyBuffer_FromReadWriteMemory
) 从 Python 预先分配的 C/C++ 内存。
这就是它的样子(欢迎反馈):
#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);
}
稍后,当您绑定时CSomeClass
,使用上面的静态函数而不是方法load
and save
:
//I think that you should use boost::python::arg instead of boost::python::args
// -- it gives you better control on the documentation
class_<CSomeClass>("CSomeClass", init<>())
.def("load", &csomeclass_load, (arg("self")), "doc for load - returns a buffer")
.def("save", &csomeclass_save, (arg("self"), arg("buffer")), "doc for save - requires a buffer")
;
这对我来说看起来足够Pythonic了。