2011-11-13 24 views
7

我试图使用Boost.Python作为接收指针的C++函数的包装,修改数据(在Python端作为numpy数组进行管理)并返回。我如何获得Python numpy和Boost.Python进行协作并为我提供函数内的原始指针?如何将一个原始指针传递给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*) 

回答

3

Andreas Kloeckner建议的一种似乎可行的方法是评论和替代方案,这是值得欢迎的。在迎接()做如下修改,

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) 
0

您可能需要使用numpy的ctypes的接口获取原始指针存储,然后使ctypes指针加倍以传递给调用。 ndarray.data是一个缓冲区类型,而不是指针。

我没有任何经验boost.python,但我怀疑类似,如果传递给包裹C++函数期待一个指针作为参数

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'> 

会工作。

+0

是的,我想这一点。然后,将错误消息读取, Boost.Python.ArgumentError:在 <...> .module.greet(LP_c_double) 没有匹配C++的Python参数类型签名: 的greet(双*) – rych