Sök…


Inledande exempel på Boost.Python

Det är lätt att använda ett C ++ -bibliotek i ett Python-projekt. Bara du kan använda Boost.

Först och främst här är en lista över komponenter du behöver:

  • En CMakeList.txt-fil eftersom du kommer att använda CMake.
  • C ++ -filerna för C ++ -projektet.
  • Python-filen - det här är ditt python-projekt.

Låt oss börja med en liten C ++ -fil. Vårt C ++ -projekt har bara en metod som returnerar viss sträng "Detta är första försöket". Kall det 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
}

Har en CMakeLists.txt-fil en nedan:

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

Genom denna del av självstudien är allt så enkelt. du kan importera biblioteket och samtalsmetoden i ditt Python-projekt. Ring ditt pythonprojekt MyProject.py .

import NativeLib
print (NativeLib.getTryString)

Följ instruktionerna nedan för att köra ditt projekt:

  • Skapa en katalog med namnet build .
  • Gå in i den katalogen.
  • Ge kommandot cmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.py . Nu måste du se strängen som metoden i ditt C ++ -projekt returnerar.

Wrapping std :: vector in boost.python

Om en funktion returnerar en std::vector , och den exponeras direkt för Python

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

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

då funktionerna kallas Python kommer att berätta för dig No to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> > , eftersom Python behöver veta hur man ska hantera std::vector .

Lyckligtvis har boost.python tillhandahållit en wrapper funciton för oss i vector_indexing_suite.hpp . Det returnerande värdet kan hanteras som ett FloatVec objekt vars element kan nås av operatören [] genom att avslöja motsvarande omslagsfunktion enligt följande.

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

Resultatet kan konverteras ytterligare till en Python-lista eller Numpy-matris genom att helt enkelt ringa list() och numpy.asarray() .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow