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)));
}
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. –
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? –