2011-11-13 34 views
7

Boost.Python'u bir işaretçi alan bir C++ işlevi için sarıcı olarak kullanmaya çalışıyorum, verileri değiştirir (örneğin Python tarafında örnek olarak sayılır) ve döndürür. Python numpy ve Boost.Python'u nasıl işbirliği yapacak ve işlev içinde işlenmemiş işaretçiyi nasıl verebilirim?Bir ham işaretçi Boost.Python'a nasıl iletilir?

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

deniyorum, ben hata alıyorum

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

,

Muhtemelen depolama ham bir işaretçi almak için numpy ctypes arayüzü kullanmak gerekecektir
Boost.Python.ArgumentError: Python argument types in 
<...>.module.greet(buffer) 
did not match C++ signature: 
greet(double*) 

cevap

3

Andreas Kloeckner tarafından önerilen işe yarayacak bir yol, yorum ve alternatifleri bekliyoruz. aşağıdaki gibi Greet() 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"; 
    } 

sadece kullanmak, değiştirilir:

print cmod.greet(a) 
0

ve sonra aramaya geçmek için iki katına bir klişe işaretçisi yapın. ndarray.data, bir işaretçi değil, bir arabellek türüdür.

Ben boost.python ile herhangi bir deneyimi yok, ancak bir argüman olarak bir işaretçi bekliyor sarılmış bir C++ işlevine geçtiyseniz

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

çalışacak gibi bir şey şüpheli.

+0

Evet, ben de denedim. Hata iletisi okur, Boost.Python.ArgumentError: <...> .module.greet (LP_c_double) Python argümanı türleri C++ imzasıyla eşleşmedi: selamlama (çift *) – rych

İlgili konular