PyBindGen的文档说,为自己的数据类型编写自定义类型处理程序很容易。但是,我没有找到任何写它们的好例子。与pybindgen一起提供的示例太基础,无法理解细节,遗憾的是,文档几乎不存在。 我需要的是:
是否有任何完整且有详细记录的向pybindgen添加自定义类型处理程序的示例?可能有人为你自己的项目做了这个并且可以分享方法吗?
我目前的绑定示例,以更好地了解我的需求。目前已完成Boost.python:
PyObject* System_getXYZ(System* s, int ind, int fr){
CREATE_PYARRAY_1D(p,3)
MAP_EIGEN_TO_PYARRAY(v,Vector3f,p)
v = s->XYZ(ind,fr);
return boost::python::incref(p);
}
...
class_<System, boost::noncopyable>("System", init<>())
...
.def("getXYZ", &System_getXYZ)
...
;
Method System :: XYZ()返回一个Eigen :: Vector3f对象。它必须转换为numpy数组而不用复制其数据。这很重要,因为整个想法都与效率有关。 目前,它是通过丑陋的宏完成的:
#define MAP_EIGEN_TO_PYARRAY(_matr,_T,_obj_ptr) \
if(!PyArray_Check(_obj_ptr)) throw pteros::Pteros_error("NumPy array expected!"); \
if(PyArray_TYPE(_obj_ptr)!=PyArray_FLOAT) throw pteros::Pteros_error("float NumPy array expected!"); \
Eigen::Map<_T> _matr((float*) PyArray_DATA(_obj_ptr), \
(PyArray_DIM((PyArrayObject*)_obj_ptr,0)==PyArray_Size(_obj_ptr)) ? PyArray_DIM(
(PyArray_DIM((PyArrayObject*)_obj_ptr,0)==PyArray_Size(_obj_ptr)) ? 1 : PyArray_
#define CREATE_PYARRAY_1D(_ptr_obj, _dim1) \
PyObject* _ptr_obj; \
{ \
npy_intp _sz_dim1[1];\
_sz_dim1[0] = _dim1; \
_ptr_obj = PyArray_SimpleNew(1, _sz_dim1, PyArray_FLOAT); \
}
它有效,但我需要为每个方法编写一个包装函数,它采用Eigen对象,这是一个维持的噩梦。这就是为什么我想尝试PyBindGen并在那里创建一个转换器,它会自动添加这些宏中的所有样板代码。
顺便说一句,boost.python转换器在这里没有帮助,因为它们强制复制数据。