Suche…


Einführungsbeispiel zu Boost.Python

Die Dinge sind einfach, wenn Sie eine C ++ - Bibliothek in einem Python-Projekt verwenden müssen. Sie können nur Boost verwenden.

Hier ist zunächst eine Liste der benötigten Komponenten:

  • Eine CMakeList.txt-Datei, da Sie CMake verwenden werden.
  • Die C ++ - Dateien des C ++ - Projekts.
  • Die Python-Datei - dies ist Ihr Python-Projekt.

Beginnen wir mit einer kleinen C ++ - Datei. Unser C ++ - Projekt hat nur eine Methode, die den String "Dies ist der erste Versuch" zurückgibt. Nennen Sie es 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
}

Habe unten eine CMakeLists.txt-Datei:

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

Durch diesen Teil des Tutorials ist alles so einfach. Sie können die Bibliothek und die Aufrufmethode in Ihr Python-Projekt importieren. Rufen Sie Ihr Python-Projekt MyProject.py auf .

import NativeLib
print (NativeLib.getTryString)

Um Ihr Projekt auszuführen, folgen Sie den Anweisungen unten:

  • Erstellen Sie ein Verzeichnis mit dem Namen build .
  • Geben Sie in dieses Verzeichnis ein.
  • Geben Sie den Befehl cmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.py . Nun müssen Sie den String sehen, den die Methode in Ihrem C ++ - Projekt zurückgibt.

Umpacken von std :: vector in boost.python

Wenn eine Funktion einen std::vector Typ zurückgibt, wird Python direkt auf diese Weise angezeigt

std::vector<float> secondMethod() {
    return std::vector<float>();
}

BOOST_PYTHON_MODULE(CppProject) {
    boost::python::def("getEmptyVec", secondMethod);
}

Wenn die Funktionen aufgerufen werden, sagt Python Ihnen, dass No to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> > , da Python wissen muss, wie mit std::vector

Zum Glück hat boost.python in vector_indexing_suite.hpp eine Wrapper-Funktion für uns vector_indexing_suite.hpp . Der zurückgegebene Wert kann als FloatVec Objekt behandelt werden, auf dessen Element der Operator [] FloatVec kann, indem die entsprechende Wrapper-Funktion wie folgt FloatVec .

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

Das Ergebnis kann in eine Python-Liste oder ein Numpy-Array umgewandelt werden, indem Sie einfach list() und numpy.asarray() .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow