boost
Korzystanie z boost.python
Szukaj…
Przykład wprowadzający na Boost.Python
Sprawy są łatwe, gdy trzeba użyć biblioteki C ++ w projekcie Python. Po prostu możesz użyć wzmocnienia.
Przede wszystkim znajduje się lista potrzebnych komponentów:
- Plik CMakeList.txt, ponieważ zamierzasz używać CMake.
- Pliki C ++ projektu C ++.
- Plik python - to twój projekt python.
Zacznijmy od małego pliku C ++. Nasz projekt C ++ ma tylko jedną metodę, która zwraca ciąg „To jest pierwsza próba”. Nazwij to CppProject.cpp
char const *firstMethod() {
return "This is the first try.";
}
BOOST_PYTHON_MODULE(CppProject) {
boost::python::def("getTryString", firstMethod); // boost::python is the namespace
}
Pobierz plik CMakeLists.txt poniżej:
cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
PYTHON_ADD_MODULE(NativeLib CppProject)
FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line
W tej części samouczka wszystko jest takie proste. możesz zaimportować bibliotekę i metodę wywołania do swojego projektu w Pythonie. Zadzwoń do projektu Python MyProject.py .
import NativeLib
print (NativeLib.getTryString)
Aby uruchomić projekt, postępuj zgodnie z instrukcjami poniżej:
- Utwórz katalog o nazwie build .
- Wejdź do tego katalogu.
- Podaj polecenie
cmake -DCMAKE_BUILD_TYPE=Release .. -
make -
python MyProject.py. Teraz musisz zobaczyć ciąg znaków, który zwraca metoda w projekcie C ++.
Zawijanie std :: vector w boost.python
Jeśli funkcja zwraca typ std::vector i jest bezpośrednio narażona na działanie Pythona
std::vector<float> secondMethod() {
return std::vector<float>();
}
BOOST_PYTHON_MODULE(CppProject) {
boost::python::def("getEmptyVec", secondMethod);
}
wtedy gdy funkcja zostanie wywołana Python powie Ci No to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> > , ponieważ Python musi wiedzieć, jak radzić sobie ze std::vector .
Na szczęście boost.python zapewnił nam funkcję otoki w vector_indexing_suite.hpp . Wartość powrotu może być traktowany jako FloatVec obiektu, którego element może być dostępne dla [] operatora, przez poddanie odpowiedniej funkcji owijki, jak następuje.
std::vector<float> secondMethod() {
return std::vector<float>();
}
BOOST_PYTHON_MODULE(CppProject) {
// wrapper function
class_<std::vector<float> >("FloatVec")
.def(vector_indexing_suite<std::vector<float> >());
boost::python::def("getEmptyVec", secondMethod);
}
Wynik może być dalej przekonwertowany na listę Python lub tablicę Numpy, po prostu wywołując list() i numpy.asarray() .