2011-11-13 3 views
7

Boost.Python을 포인터를받는 C++ 함수의 래퍼로 사용하려고합니다. 예를 들어 파이썬 측에서 numpy 배열로 관리되는 데이터를 수정하고 반환합니다. 파이썬 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); 
} 

내가하려고, 난 오류가

import numpy as np 
a = np.empty([2], dtype=np.double) 
raw_ptr = a.data 
print cmod.greet(raw_ptr) 

,

당신은 아마 저장에 원시 포인터를 얻기 위해 NumPy와의하는 ctypes 인터페이스를 사용해야합니다
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"; 
    } 

는 사용, 수정 :

print cmod.greet(a) 
0

, 그리고 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

관련 문제