2011-11-13 9 views
7

私はBoost.Pythonをポインタを受け取るC++関数のラッパーとして使用しようとしています(例えばnumpy配列としてPython側で管理されている)データを修正して返します。どのようにしてPythonのnumpyとBoost.Pythonをコラボレーションさせ、関数内の生のポインタを私に渡すのですか? 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); 
} 

私がしようと、

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氏が提案する、うまくいく方法の1つは、コメントと代替方法を歓迎します。挨拶は、()は、次のように変更Pythonで

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"; 
    } 

だけで使用されています

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:Pythonの引数型が <...> .module.greet(LP_c_double) と一致しませんでした。C++の署名: greet(double *) – rych

関連する問題