Bindings Python de librerías C++ con Boost.Python

Python

Ejemplos mínimos para empezar con Boost.Python, probablemente la mejor libreŕia de generación de bindings Python para C++.

Introducción

Boost es un conjunto de librerías de calidad reconocida con amplio uso entre la comunidad de programadores C++, hasta el punto de que algunos de sus diseños e implementaciones pasarán a formar parte de la próxima versión del estándar C++, más conocido como C++0x. Por eso Boost.Python es una garantía de éxito.

Ingredientes

  • python
  • python-dev
  • libboost-python1.35-dev

Hello (una función)

hello.cc

#include <string>
 
std::string hello() {
   return "hello, world";
}

hello_wrapper.cc

#include <boost/python.hpp>
 
std::string hello();
 
using namespace boost::python;
 
BOOST_PYTHON_MODULE(Hello) {
    def("hello", hello);
}

Makefile

CXXFLAGS=-I/usr/include/python2.4
LDFLAGS=-shared -lboost_python
 
Hello.so: hello.o hello_wrapper.o
	$(CC) $(LDFLAGS) -o $@ $^
 
clean:
	$(RM) Hello.so *.o *~

hello.py (ejemplo de uso)

#!/usr/bin/python
import Hello
print Hello.hello()

Bindings para una clase

control.h

class IntRW {
private:
    int _state;
 
public:
    void set(int value) {
        _state = value;
    }
 
    int get() {
        return _state;
    }
};

control_wrapper.cc

#include <boost/python.hpp>
#include "control.h"
 
using namespace boost::python;
 
BOOST_PYTHON_MODULE(Control)
{
    class_<IntRW>("IntRW")
        .def("set", &IntRW::set)
        .def("get", &IntRW::get)
    ;
}

control.py (ejemplo de uso)

#!/usr/bin/python
import Control
actuator = Control.IntRW()
actuator.set(100)
print actuator.get()

Referencias

La documentación de Boost.Python está un poco anticuada, pero es lo que hay:

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de david.villa

Ejemplos con STL

Bindings de Python con Boost para map y vector en: https://arco.esi.uclm.es/svn/public/samples/boost.python/stl/

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.

Imagen de brue

muchas...

... gracias.

--
"Computer Science is no more about computers than astronomy is about telescopes."
– Edsger W. Dijkstra

brue

Imagen de david.villa

Sorry

Lo publiqué sin darme cuenta. Pensaba añadir algo de wrapping de contenedores STL antes de publicarlo, pero la verdad es que ahora no tengo tiempo. Si la quieres continuar tú, adelante.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.