Boost.Pythonに生ポインタを渡すには?

Boost.Pythonをポインタを受け取るC
++関数のラッパーとして使用しようとしています。データを変更します(たとえばPython側でnumpy配列として管理されます)。どのようにしてPythonのnumpyとBoost.Pythonをコラボレーションさせ、関数内の生のポインタを私に渡すのですか?

#include 
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によって提案された、うまくいくと思われる方法の1つは、コメントと代替案を歓迎します。
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)

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です