如何将一个原始指针传递给Boost.Python?
我试图使用Boost.Python作为接收指针的C ++函数的包装器,修改数据(在Python端作为numpy数组进行管理)并返回。 我如何获得Python numpy和Boost.Python进行协作并为我提供函数内的原始指针?
#include <boost/python.hpp>
namespace
{
char const *greet(double *p)
{
*p = 2.;
return "hello world";
}
}
BOOST_PYTHON_MODULE(module)
{
boost::python::def("greet", &greet);
}
在我尝试Python时,
import numpy as np
a = np.empty([2], dtype=np.double)
raw_ptr = a.data
print cmod.greet(raw_ptr)
我得到错误,
Boost.Python.ArgumentError: Python argument types in
<...>.module.greet(buffer)
did not match C++ signature:
greet(double*)
似乎有效的一种方式,由Andreas Kloeckner建议,评论和替代方案是受欢迎的。 greet()被修改如下,
char const *greet(boost::python::object obj) {
PyObject* pobj = obj.ptr();
Py_buffer pybuf;
if(PyObject_GetBuffer(pobj, &pybuf, PyBUF_SIMPLE)!=-1)
{
void *buf = pybuf.buf;
double *p = (double*)buf;
*p = 2.;
*(p+1) = 3;
PyBuffer_Release(&pybuf);
}
return "hello world";
}
在Python中只使用:
print cmod.greet(a)
您可能需要使用numpy ctypes接口来获取指向存储的原始指针,然后将ctypes指针加倍以传入呼叫。 ndarray.data
是一个缓冲区类型,不是指针。
我没有任何boost.python
经验,但我怀疑像
In [28]: x=np.array([1,2,3,4],dtype=np.double)
In [29]: p=x.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
In [30]: type(p)
Out[30]: <class 'ctypes.LP_c_double'>
如果传递给一个包含C ++函数的函数需要一个指针作为参数,它将会工作。
链接地址: http://www.djcxy.com/p/9907.html