Valkertown Home

2008-01-21-swig python

Bueno, hace poco jugue un poco con Swig, para generar modulos de python desde c en particular.

Resulta una tarea muy simple

Escribi un Makefile que ilustra los pasos de una forma más o menos simple, este Makefile esta más bien orientado a Slackware 12 pero se puede saber facilmente que partes deben ser modificadas para otros *nix.

#Makefile

MODULE=anything

all:
    swig -Wall -python $(MODULE).i
    cc -c $(MODULE).c $(MODULE)_wrap.c -I/usr/include/python2.5/ -I/usr/lib/python2.5/config
    ld -shared $(MODULE).o $(MODULE)_wrap.o -o _$(MODULE).so
clean:
    -rm *.o $(MODULE)_wrap.c _$(MODULE).so $(MODULE).py $(MODULE).pyc

En mi caso utilice swig para generar una interface para una libreria muy simple que comprendia unas cuantas funciones.

Fuera de anything.c y anything.h que son especificas de la libreria en C, se necesita anything.i que le indica a swig algunas cosas sobre el "wrapper" que debe generar, un ejemplo:

// anything.i
y%module anything
%{
#include "anything.h"
%}
%apply (char *STRING, int LENGTH) { (char * message, int nBytes) };
%include anything.h

Este ejemplo sirve tal cual para librerias de C que no tengan tipos de datos propios y otras restricciones más, sin embargo esto cubre un pequeño hueco que tenia en mis programas de python.

La linea:

%apply (char *STRING, int LENGTH) { (char * message, int nBytes) };

Permite pasar cadenas de python a funciones de c que reciben un apuntador(message) y su longitud(nBytes) como argumentos. Tiene que recibirlos exactamente igual a como se le indican a Swig en la directiva, pero no importa si recibe más argumentos antes o despues del patrón.

Existen muchas otras sutilezas que se encuentra uno al hacer wrappers pero eso ya es de leer el manual en la página oficial de Swig.

EOC

comments powered by Disqus

© 2008-2012 Carlos A. Perilla deepspawn at valkertown dot org | Based on original design by Andreas Viklund