boost
Verwendung von boost.python
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() .