boost
Usando boost.python
Buscar..
Ejemplo introductorio en Boost.Python
Las cosas son fáciles cuando tienes que usar una biblioteca de C ++ en un proyecto de Python. Solo puedes usar Boost.
En primer lugar, aquí hay una lista de los componentes que necesita:
- Un archivo CMakeList.txt, porque vas a utilizar CMake.
- Los archivos C ++ del proyecto C ++.
- El archivo python - este es tu proyecto python.
Vamos a empezar con un pequeño archivo de C ++. Nuestro proyecto C ++ tiene solo un método que devuelve una cadena "Este es el primer intento". Llámalo 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
}
Tenga un archivo CMakeLists.txt a continuación:
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
Por esta parte del tutorial todo es muy fácil. puede importar la biblioteca y el método de llamada en su proyecto python. Llame a su proyecto de Python MyProject.py .
import NativeLib
print (NativeLib.getTryString)
Para ejecutar su proyecto siga las instrucciones a continuación:
- Crear un directorio con el nombre de construcción .
- Entra en ese directorio.
- Dé el comando
cmake -DCMAKE_BUILD_TYPE=Release .. -
make -
python MyProject.py. Ahora, tiene que ver la cadena que devuelve el método en su proyecto C ++.
Envolviendo std :: vector en boost.python
Si una función devuelve un tipo std::vector , y se expone a Python directamente como
std::vector<float> secondMethod() {
return std::vector<float>();
}
BOOST_PYTHON_MODULE(CppProject) {
boost::python::def("getEmptyVec", secondMethod);
}
luego, cuando las funciones se llamen, Python le dirá No to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> > , porque Python necesita saber cómo lidiar con std::vector .
Afortunadamente, boost.python ha proporcionado una función de envoltorio para nosotros en vector_indexing_suite.hpp . El valor de retorno puede manejarse como un objeto FloatVec cuyo elemento puede acceder el operador [] , exponiendo la función de envoltura correspondiente de la siguiente manera.
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);
}
El resultado se puede convertir aún más en una lista de Python o una matriz de Numpy simplemente llamando a la list() y numpy.asarray() .