2013-09-05 12 views
6

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

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. –

+0

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? –

Odpowiedz