boost
Med hjälp av boost.python
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() .