boost
Boost.python gebruiken
Zoeken…
Inleidend voorbeeld op Boost.Python
Dingen zijn eenvoudig wanneer u een C ++ -bibliotheek in een Python-project moet gebruiken. Alleen jij kunt Boost gebruiken.
Allereerst is hier een lijst met componenten die u nodig hebt:
- Een CMakeList.txt-bestand, omdat je CMake gaat gebruiken.
- De C ++ -bestanden van het C ++ -project.
- Het python-bestand - dit is je python-project.
Laten we beginnen met een klein C ++ -bestand. Ons C ++ project heeft slechts één methode die een string teruggeeft "Dit is de eerste poging". Noem het 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
}
Heb een CMakeLists.txt-bestand hieronder:
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
In dit deel van de tutorial is alles zo eenvoudig. u kunt de bibliotheek en de aanroepmethode in uw python-project importeren. Bel uw python-project MyProject.py .
import NativeLib
print (NativeLib.getTryString)
Volg de onderstaande instructies om uw project uit te voeren:
- Maak een map met de naam build .
- Ga naar die map.
- Geef het commando
cmake -DCMAKE_BUILD_TYPE=Release .. -
make -
python MyProject.py. Nu moet je de string zien die de methode in je C ++ project retourneert.
Wrapping std :: vector in boost.python
Als een functie een std::vector type retourneert, en het wordt direct aan Python blootgesteld
std::vector<float> secondMethod() {
return std::vector<float>();
}
BOOST_PYTHON_MODULE(CppProject) {
boost::python::def("getEmptyVec", secondMethod);
}
wanneer de functies Python worden genoemd, wordt u verteld dat No to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> > , omdat Python moet weten hoe om te gaan met std::vector .
Gelukkig heeft boost.python een wrapper-functie voor ons beschikbaar gesteld in vector_indexing_suite.hpp . De terugkerende waarde kan worden behandeld als een FloatVec object waarvan het element toegankelijk is voor de operator [] , door de bijbehorende wrapper-functie als volgt bloot te leggen.
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);
}
Het resultaat kan verder worden omgezet in een Python-lijst of Numpy-array door eenvoudig list() en numpy.asarray() aan te roepen.