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:



blog comments powered by Disqus