2013-09-05 10 views
6

Sto usando Boost Python, ho generato un grande vettore di interi in C++ e mi piacerebbe accedere a questo vettore in Python senza copiarlo.Passa il puntatore da C++ a Python/w boost python?

In C++ ho:

BOOST_PYTHON_MODULE(myModule) 
{ 
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>()); 
    def("ReturnVectorPtr", ReturnVectorPtr, return_value_policy<manage_new_object>()); 
} 

vector<int>* ReturnVectorPtr() 
{ 
    return new vector<int>(); 
} 

Poi in python che ho:

import myModule 
myModule.ReturnVectorPtr() 

Questo fa sì che Python in crash, anche se io non sono nemmeno memorizzare il valore di ritorno. Qualche idea su quale sia il mio errore?

Edit:

Il seguente codice funziona per ottenere i dati nel vettore da C++ a Python, ma perdite di memoria. I vettori vengono copiati e quindi non disposti?

In C++:

BOOST_PYTHON_MODULE(myModule) 
{ 
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>()); 
    def("ModifyVectorInPlace", ModifyVectorInPlace); 
} 

void ModifyVectorInPlace(vector<int>& data) 
{ 
    // Modify data... 
    return; 
} 

Poi in python che ho:

import myModule 
vectorInt = myModule.vectorInt() 
myModule.ModifyVectorInPlace(vectorInt) 

Che cosa sta succedendo?

Edit 2:

ho provato l'esempio "Raw C++ puntatori" da qui, esattamente come è scritto: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers

si blocca troppo. Sembra che non riesco a ottenere un puntatore a qualsiasi cosa passò in Python per qualche motivo ...

Edit 3:

L'incidente sembra essere un segfault da invoke.hpp, in questa funzione:

template <class RC, class F BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class AC)> 
inline PyObject* invoke(invoke_tag_<false,false>, RC const& rc, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac)) 
{ 
    return rc(f(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac,() BOOST_PP_INTERCEPT))); 
} 
+0

Il codice iniziale funziona per me. Può valere la pena verificare che Boost.Python e 'myModule' vengano costruiti sulla stessa versione di Python e che utilizzino la stessa configurazione di build Boost.Python. Inoltre, verifica che 'myModule' si colleghi alla versione Boost.Python da cui è stata creata. –

+0

Penso che tutto usi librerie Python coerenti. Ho controllato con Dependency Walker ma potrei aver perso qualcosa. Sto usando Python 2.7.5 a 64 bit e sto compilando con Mingw-w64 su Windows. Ho dovuto usare gendef e dlltool per generare libpython27.a da python27.dll. Potrebbe avere qualcosa a che fare con questo? –

risposta

Problemi correlati