ich Boost-Python verwende, ich generieren, ohne das Kopieren einer großen Vektor von ganzen Zahlen in C++, und ich möchte diesen Vektor in Python zugreifen.Zeiger übergeben von C++ auf Python/w boost python?
In C++ Ich habe:
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>();
}
Dann in Python Ich habe:
import myModule
myModule.ReturnVectorPtr()
Dieser Python zum Absturz bringt, obwohl ich nicht einmal den Rückgabewert zu speichern bin. Irgendwelche Ideen darüber, was mein Fehler ist?
Edit:
Der folgende Code für das Erhalten der Daten in dem Vektor von C++ zu Python funktioniert, aber verliert Speicher. Werden die Vektoren kopiert und dann nicht entsorgt?
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;
}
Dann in Python Ich habe:
import myModule
vectorInt = myModule.vectorInt()
myModule.ModifyVectorInPlace(vectorInt)
Was ist los?
Edit 2:
Ich versuchte, das "Raw C++ Pointers" Beispiel von hier, genau wie geschrieben: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers
Er stürzt zu. Es scheint, dass ich nicht einen Zeiger auf etwas ging in Python aus irgendeinem Grunde ...
bearbeitet 3 erhalten kann:
Der Absturz erscheint ein segfault von invoke.hpp zu sein, in dieser Funktion:
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)));
}
Der ursprüngliche Code funktioniert für mich. Es kann sich lohnen, Verifizieren, dass Boost.Python und 'myModule' gegen die gleiche Version von Python gebaut werden, und mit der gleichen Boost.Python Build-Konfiguration. Überprüfen Sie außerdem, ob "myModule" mit der Boost.Python-Version verknüpft ist, für die es erstellt wurde. –
Ich denke, dass alles im Einklang Python-Bibliotheken verwendet. Ich habe mit Dependency Walker nachgesehen, aber vielleicht habe ich etwas verpasst. Ich verwende 64-Bit Python 2.7.5 und kompiliere mit Mingw-w64 unter Windows. Ich musste mit gendef und dlltool libpython27.a aus python27.dll erzeugen. Könnte das etwas damit zu tun haben? –