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() .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow