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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow