2011-11-13 21 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