Używam Boost Python, generuję duży wektor liczb całkowitych w C++ i chciałbym uzyskać dostęp do tego wektora w Pythonie bez jego kopiowania.Przełóż wskaźnik z C++ na Python/w boost python?
W C++ mam:
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>();
}
Następnie w Pythonie mam:
import myModule
myModule.ReturnVectorPtr()
To powoduje awarię Python, chociaż nie jestem nawet przechowywania wartości zwracanej. Jakieś pomysły na temat mojego błędu?
Edit:
Poniższy kod działa dla uzyskania danych w wektorze z C++ do pytona, ale przecieki pamięci. Czy wektory są kopiowane, a następnie nie są usuwane?
W 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;
}
Następnie w Pythonie mam:
import myModule
vectorInt = myModule.vectorInt()
myModule.ModifyVectorInPlace(vectorInt)
Co się dzieje?
Edit 2:
Próbowałem "Raw C++ wskaźniki" przykład stąd, dokładnie tak, jak napisano: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers
To też wywala. Wydaje się, że nie mogę uzyskać wskaźnik do niczego przeszła w Pythonie z jakiegoś powodu ...
Edit 3:
Katastrofa wydaje się być segfault z invoke.hpp, w tej funkcji:
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)));
}
Początkowy kod działa dla mnie. Warto sprawdzić, czy Boost.Python i 'myModule' są budowane przeciwko tej samej wersji Pythona i używają tej samej konfiguracji kompilacji Boost.Python. Dodatkowo sprawdź, czy 'mójModuł' łączy się z wersją Boost.Python, z której została zbudowana. –
Myślę, że wszystko używa spójnych bibliotek Pythona. Sprawdziłem z Dependency Walker, ale mogłem coś przeoczyć. Używam 64-bitowego Pythona 2.7.5 i kompilacji z Mingw-w64 w systemie Windows. Musiałem użyć gendef i dlltool do wygenerowania libpython27.a z python27.dll. Może to ma coś wspólnego z tym? –