Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
4Activity
0 of .
Results for:
No results containing your search query
P. 1
Enlazando Python con la realidad

Enlazando Python con la realidad

Ratings: (0)|Views: 53|Likes:
Published by Aprender Libre
Python, Perl, Php, Ruby… todos adolecen del mismo problema, tarde o temprano tendremos que volver al
mundo real y trabajar con una librería C.
Python, Perl, Php, Ruby… todos adolecen del mismo problema, tarde o temprano tendremos que volver al
mundo real y trabajar con una librería C.

More info:

Published by: Aprender Libre on Jun 30, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/01/2013

pdf

text

original

 
Enlazando Python con la realidad
REUTILIZACIÓNDE CODIGO
Python, Perl, Php, Ruby… todos adolecen del mismo problema, tarde o temprano tendremos que volver almundo real y trabajar con una librería C.
POR JOSÉ MARÍA RUIZ
Y
a en los años 70 la gente delmundo de la Ingeniería delSoftware comenzó a imaginar unfuturo donde sólo se avanzaría. Nohabría que volver a escribir programaspara problemas ya resueltos. El famoso:“No reinventes la rueda”. Comenzaron ahablar de objetos y componentes.Desgraciadamente esta visión del futu-ro se parecía demasiado a esa otra en laque todos vamos en cohetes al trabajo ycomemos en una hamburguesería queorbita alrededor de la Tierra. La realidades más extraña ¿quién se imaginaba unordenador en cada casa y todos conecta-dos mundialmente?A día de hoy el código más reutiliza-do es que viene en forma de librerías,ya sea de funciones o de objetos. Pero lamayor parte de estas librerías, y espe-cialmente en el mundo de Linux, hansido programadas en C o C++. Estoslenguajes, debido a múltiples factores,han sido los más populares para el des-arrollo de librerías y sistemas, y hoy porhoy siguen siendo insustituibles enmuchos ámbitos. De C se destacaba suportabilidad (es muy sencillo encontraro crear un compilador de C para unanueva arquitectura) mientras que deC++, su balance entre portabilidad ycapacidad para grandes diseños.En este artículo vamos a ver cómopodemos hacer uso de una pequeñalibrería C desde Python a través de unejemplo gráfico.
Nuestra librería OpenGL en C
La librería que vamos a utilizar va a pro-veer una serie de funciones que nos per-miten manipular objetos 3D a través deOpenGL. ¿A que suena rimbombante? Enrealidad no es tan difícil. No entraremosen detalles respecto a OpenGL, peroaclararemos un poco qué es.OpenGL es un estándar mundial crea-do por SGI (Silicon Graphics Interactive)para el desarrollo de aplicaciones 3Dinteractivas. Esto traducido a la informá-tica doméstica significa… ¡juegos!.Todos los juegos multiplataforma queutilicen 3D están programados utilizan-do OpenGL (DirectX, la otra alternativa,sólo funciona bajo plataformasMicrosoft, o sea en sistemas Intel conWindows).OpenGL tiene un diseño simple, losobjetos se componen de vértices (untriángulo tiene 3 vértices) y estos vérti-ces definen áreas que pueden tener unaserie de propiedades como puede sercolor o brillo. Una vez definidos los obje-tos pasamos a crear una serie de funcio-nes que serán llamadas cuando se pro-duzcan eventos. OpenGL utiliza un bucleinfinito que, básicamente, se dedica arecoger un evento, por ejemplo, la pulsa-ción de una tecla por parte del usuario,para, a continuación, llamar a la funciónque se dedica a gestionarlo. Así de sim-ple.Evidentemente hacer un videojuego3D es una tarea muy complicada, pero labase es esa, hacer que las imágenes enpantalla reaccionen a eventos que se dis-paran en cualquier momento y que lareacción sea en tiempo real, o sea, que elusuario no perciba demora en el tiempode reacción. Todos hemos actualizadonuestra tarjeta gráfica alguna vez paraque la sensación, a más “frames porsegundo” mejor, fuese más realista.En el Listado 1 (descargable desde [5])podemos ver un programa OpenGL muy
Python •
DESARROLLO
57
Número 09
WWW.LINUX
-
MAGAZINE.ES
57
 
compli-cados que sólodeben ser usados porexpertos, y la mayor partedel personal de Los Álamos soncientíficos con poca preparación en pro-gramación. Así que tenemos potentísi-mas librerías C y Fortran desarrolladasen lenguajes que no son capaces de usarsus destinatarios.¿Qué hicieron los ingenieros de LosÁlamos para simplificar el uso de estaspotentes herramientas de cálculo? Puesse dedicaban a crear librerías que permi-tiesen manejarlas desde lenguajes másexpresivos, como pueden ser Perl oPython. Este proceso, a la vez que labo-rioso, es altamente repetitivo, de maneraque decidieron no volver a tener quepasar por él. Desarrollaron SWIG que, deforma casi automática, genera todo elcódigo necesario para utilizar desde mul-titud de lenguajes de alto nivel (desdePython hasta OCaml pasando por Java oC#) librerías de C.Lo de
casi automático
es esencial. Sólotenemos que generar un fichero de inter-faz (acabado en extensión
.i
) y SWIGgenerará un fichero
<nombre>_wrap.c 
que compilaremos junto al original paracrear la librería. De esta manera obten-dremos una librería dinámica (esosficheros
.so
que podemos ver a miles en
 /usr/lib
), así como una librería en el len-guaje de destino. En nuestro caso eselenguaje será Python.
El programa OpenGL.
En el Listado 1 vimos un programa deejemplo en OpenGL. Es básicamente uncubo, que gira y responde a eventos.Tiene una serie de propiedades que nopodemos alterar, como la velocidad degiro o el color. En el Listado 3 (descarga-ble desde [5])veremos la librería equiva-lente necesaria para nuestros propósitos.Examinémosla.Para comenzar, al ser una librería nopuede tener función
main
, así que lahemos renombrado
arranque()
. Se hanincorporado nuevas funciones con elobjetivo de poder modificar algunascaracterísticas del objeto (color, veloci-dad, título de la ventana…).OpenGL (ver [2] en recursos) se com-pone de las librerías GL, GLU y GLUT.Esta última es muy importante, pero des-graciadamente la librería GLUT estándartiene un defecto ( o problema, segúncomo se mire). La función
 glutMainLoop()
es el bucle infinito degestión de eventos. Se entra en ella perojamás se sale. Cuando se dispara el even-to que provoca la salida del bucle, el pro-grama acaba. Cualquier cosa que ponga-mos detrás de la llamada a
 glutMainLoop()
no se ejecutará jamás.Eso no parece muy lógico ¿no? ¿y siquiero poder arrancar el gestor de even-tos, pararlo y volver a arrancar? Comono somos los únicos con este problema(casi todo el mundo piensa que es unproblema ;) unos valientes, en la mejortradición del software libre, han creado
 FreeGLUT 
(ver [3] en Recursos para másinformación). Básicamente es igual aGLUT solo que, entre otras cosas, nospermite salir del bucle interno de
 glutMainLoop()
pero sin que finalice elprograma.¿Y por qué queremos que ocurra esto?Pues porque necesitamos una librería,queremos que la función
arranque()
vuelva al programa principal (que seránuestro intérprete de Python) una vezque finalice su ejecución, en lugar definalizar todo el programa.Este un un problema típico que nospodemos encontrar al crear librerías paraPython usando librerías C. A veces loque queremos usar son las funciones deun programa ya existente (por ejemplo,imagina poder acceder a las funcionesque tiene Mozilla o Firefox para RSS oanálisis de HTML), así que los pasosserán: elimina los puntos de salida delprograma (generalmente los
exit()
) y eli-mina el
main
.Así ya tendremos nuestra librería, listapara ejecutar SWIG sobre ella.
El archivo de interfaz paraSWIG
SWIG (ver [4] en Recuros) necesita unarchivo que le diga qué funciones y defi-niciones de datos exportar a Python. Estesimple, peroque será la base paranuestra librería. Para compilarlo debere-mos ejecutar
make listado1
en el mismodirectorio en que esté, copiando a esedirectorio el contenido del Listado 2(descargable desde [5])a un fichero lla-mado
 Makefile
.¿Y qué hace nuestro programa? Puesnuestro programa base genera un cubo3D con texturas y lo gira sin parar hastaque pulsamos la tecla ‘2’. Entonces lodetiene, comenzando a girar de nuevocuando pulsemos la tecla ‘1’. Con los tresbotones del ratón podemos cambiar elángulo en el que gira el cubo.Si compilamos el programa tal cualobtendremos un ejecutable que podre-mos usar. La velocidad a la que gire elcubo depende de la potencia del equipode cada uno.Ahora necesitamos algo para “pegar”código C con Python, y ese algo esSWIG.
SWIG
SWIG es una aplicación desarrollada en1995 en el departamento de FísicaTeórica del Los Álamos NationalLaboratory (ver [1] en Recursos). Fue allídonde se desarrolló la primera bombaatómica y desde entonces ha sido uncentro puntero en investigación a nivelmundial. El objetivo era el de reducir lacomplejidad de muchas aplicacionescientíficas donde es obligado el uso delenguajes de bajo nivel, como C oFortran. Desgraciadamente con estos len-guajes es muy complicado, por ejemplo,desarrollar GUI que a día de hoy sonimprescindibles. También son lenguajes
DESARROLLO
Python
58
Número 09
WWW.LINUX
-
MAGAZINE.ES
 
Python •
DESARROLLO
59
Número 09
WWW.LINUX
-
MAGAZINE.ES
para aislarcódigo especí-fico paraSWIG respec-to de las libre-rías origina-les.Y bueno,casi hemosacabado, sólonos quedadeclarar lostipos de datosy cabeceras necesarias. Podemos ver lasdefiniciones en el Listado 4 (descargableen [5]). Básicamente son las cabecerasde las funciones que queremos usardesde Python con la palabra
extern
delante. Esta palabra le dice a SWIG queson funciones que existen en un ficheroexterno.
Las palabras mágicas
Ya tenemos casi lista la poción, ahorasólo tenemos que usar las palabras mági-cas del Listado 5 (descargable en [5]).Éste muestra un fichero
 Makefile
que yausamos para compilar el Listado 1, ahoratenemos que ejecutar:
> make
Y se realizará la ejecución de las órde-nes:
swig -python listado3.igcc -c -fPIC listado3.c $(INCS)gcc -c -fPIC listado3_wrap.c
$(PYINCS) $(INCS)gcc -shared listado3.c
listado3_wrap.c -o _listado3.so
$(INCS) $(PYINCS) $(LIBS)
$(PYLIBS)
El primer comando genera el fichero
lis-tado3_wrap.c 
, así como
listado3.py
. Hayuna opción,
-python
que podríamos cam-biar por
-perl
o
-java
. Esta opción contro-la el lenguaje que se utilizará para gene-rar la librería.Pero claro, estos ficheros noson más que código,hay que compilarlos. De eso se encarganlos tres siguientes comandos. El primerocompila nuestra librería, el segundo losficheros generados por SWIG y el tercerolo une todo para generar la librería diná-mica.Esos
$(INC)
o
 PYLIBS
son opciones decompilación guardadas en variables decontrol en el Makefile, varían de sistemaen sistema, pero las que aparecen en elListado 5 son las más genéricas.
Nueva librería
Por increíble que parezca hemos acaba-do, ya tenemos nuestra librería. Si mira-mos en el directorio en el que hemosestado realizando todas las accionesveremos un fichero llamado
_listado3.so
.Es una librería dinámica que puede sercargada en cualquier momento. ¿A quéesperamos? Arranquemos nuestro intér-prete de Python:
> pythonPython 2.4 (#2, Apr 3 2005,
22:24:02)[GCC 3.4.2 [FreeBSD] 20040728]
on freebsd5Type "help", "copyright",
"credits" or "license" for more
information.>>> import listado3>>>
Con la orden
import 
acabamos de cargarla librería y la tenemos disponible parasu uso. Comencemos con la acción mássimple, arranquemos el programa con lasopciones por defecto:
>>>listado3.arranque()
Cuando pulsemos
 INTRO
aparecerá unaventana en la pantalla con un objeto quese mueve a gran velocidad. Es nuestrocubo, lo que ocurre es que se muevedemasiado rápido. Si pulsamos la tecla
2
, el cubo se detendrá, para ponerlo denuevo en movimiento debemos pulsar
1
.fichero se parece mucho a los ficheros decabeceras (o
headers
, mirar en
 /usr/include
para ver unos cuantos) deC. El fichero comienza con la sentencia:
%module listado3
Que declara el nombre del módulo ydebe ser igual al nombre de nuestralibrería C. Este nombre será exportado acada lenguaje de manera que se corres-ponda con la estructura de organizaciónque en él exista. En el caso de Python elnombre del módulo se corresponderácon un paquete.El resultado final de la ejecución deSWIG será un fichero llamado
lista-do3_wrap.c 
. Es un fichero en lenguaje C,que define una serie de funciones quenos permitirán acceder a la librería
lista-do3.c 
definidas en
listado3.i
.Algunas de las definiciones que pon-dremos en
listado3.i
devuelven datos detipos definidos en OpenGL, por lo quetendremos que decirle a SWIG que en elfichero
listado3_wrap.c 
debe incorporarla cabecera:
#include <GL/glut.h>
Esto se hace mediante la declaración:
%{#include <GL/glut.h>%}
Entre los símbolos
%{
y
%}
podemosintroducir cualquier declaración extra oincluso código que no exista en el fichero
listado3.c 
. Digamos que es una manera
Figura 1: El cubo inicial tal y comose ve en la ventana del programa.Figura 2: Con las teclas podemosmodificar su posición y giro.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->