2011-11-13 20 views
7

Sto provando a usare Boost.Python come wrapper per una funzione C++ che riceve un puntatore, modifica i dati (gestiti su lato Python come array numpy per esempio) e restituisce. Come faccio a ottenere Python Numpy e Boost.Python per collaborare e per darmi il puntatore raw all'interno della funzione?Come passare un puntatore raw a 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); 
} 

In Python quando provo,

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

ottengo l'errore,

Boost.Python.ArgumentError: Python argument types in 
<...>.module.greet(buffer) 
did not match C++ signature: 
greet(double*) 

risposta

3

Un modo che sembra funzionare, suggerito da Andreas Kloeckner, i commenti e le alternative sono i benvenuti. Il greet() è modificato come segue,

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

in Python basta usare:

print cmod.greet(a) 
0

Si avrà probabilmente bisogno di utilizzare l'interfaccia ctypes NumPy per ottenere un puntatore prime per l'archiviazione e quindi creare un puntatore ctypes da raddoppiare per passare alla chiamata. ndarray.data è un tipo di buffer, non un puntatore.

non ho alcuna esperienza con boost.python, ma ho il sospetto qualcosa come

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

funzionerà se passato a una funzione avvolto C++ che prevede un puntatore come argomento.

+0

Sì, ho provato anche questo. Viene quindi visualizzato il messaggio di errore Boost.Python.ArgumentError: tipi di argomenti Python in <...> .module.greet (LP_c_double) non corrisponde alla firma C++: greet (double *) – rych

Problemi correlati