1. PYTHON
Universidad Nacional de
Ingenieria
Centro de Tecnologias de
Informacion y
Comunicaciones
Facultad de Ciencias
Abraham Zamudio Ch.
2. PYTHON
Clase 5
Abraham Zamudio Ch.
abraham.zamudio@gmail.com
3. SWIG
Hoy en día los lenguajes de script como Perl, Python y Tcl reciben mucha
atención principalmente porque estos lenguajes facilitan el desarrollo y
prototipado de las Aplicaciones de Rápido Desarrollo (RAD). Se ha demostrado
que el uso de un lenguaje como Python acelera notablemente el tiempo de
desarrollo, con la ventaja añadida de obtener un código robusto y flexible. Pero
hay situaciones en que el método de script no es funcional, como por ejemplo
en aplicaciones científicas que requieren procesos matemáticos de alta
velocidad, rutinas gráficas o aplicaciones que precisan controlar y coordinar
dispositivos hardware en tiempo real. Lo que necesitamos es arquetipo
lenguaje-mexclado en el cual los lenguajes tradicionales de sistemas como
C/C++ hacen el trabajo sucio de bajo nivel mientras el lenguaje de script actuan
sobre ellos como supervisión. Este artículo trata sobre el uso de un excelente
programa llamado Simplified Wrapper and Interface Generator (SWIG)
(Generador simplificado de Interfaces y envoltorios) para integrar código escrito
en C/C++ con el popular lenguaje de script Python.
http://www.swig.org/Doc1.3/SWIGDocumentation.html
4. Modulos en C para PYTHON
Bindings
Un binding es literalmente un puente entre dos
sistemas. En el caso de python se llama
EXTENCION entre bibliotecas desarrolladas en C
para su uso en el interprete de python
5. Modulos en C para PYTHON
Pero que se gana con esto:
● Permite la integracion con sistemas antiguos, al
final de cuentas C tiene mas tiempo en uso quye
python y podemos escribir actualizaciones en
python.
● Se desea aprovechar una base de codigo C
existente en un ambiente y convivir en armonia.
● Se desea mejorar el desempeño de un
programa , reescribiendo partes en python
(plotear es mas sencillo en python).
6. SWIG : 1º EJEMPLO
Digamos que tenemos // arit.c
una función en C
llamada
int suma(int a, int b)
suma(a, b)
{
que devuelve la suma
de los dos números que return a+b;
le pasamos como }
argumentos. Veremos
como la función suma
puede hacerse
accesible para Python.
Crearemos un archivo
7. SWIG : 1º EJEMPLO
Archivo de Interface (.i)
SWIG necesita un archivo que le diga qué
funciones y definiciones de datos exportar a
Python. Este fichero se parece mucho a los
ficheros de cabecera (o headers , para ver
ejemplos mirar en /usr/include).
El fichero comienza con la sentencia :
%module arit
Que declara el nombre del modulo y debe ser
igual al nombre del archivo .c (arit.c)
8. SWIG : 1º EJEMPLO
Este nombre será //arit.i
exportado a cada %module arit
lenguaje de manera
que se corresponda %{
con la estructura de extern int suma(int a, int b);
organización que en
él exista. En el caso %}
de Python el nombre
del módulo se extern int suma(int a, int b);
corresponderá con un
paquete.
9. SWIG : 1º EJEMPLO
Ahora ejecutamos el siguiente comando:
swig -python arit.i
Esto generara dos archivos:
●arit.py
●arit_wrap.c
Debemos compilar los ficheros arit.c y arit_wrap.c
para producir los ficheros objeto, el comando
sería:
gcc -c arit.c arit_wrap.c -I/usr/include/python2.6
10. SWIG : 1º EJEMPLO
Los archivos objeto arit.o y arit_wrap.o deberán
ser combinados para producir un objeto
compartido llamado _arit.so:
ld -shared arit.o arit_wrap.o -o _arit.so
Generando un archivo _arit.so
11. SWIG : 1º EJEMPLO
Si ejecutamos python :
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more
information.
>>> import arit
>>> arit.suma(12,13)
25
>>>
12. SWIG:COMPARACION PYTHON-C
Vamos a añadir una función más a nuestro
archivo arit.c y recompilaremos arit.so:
int fact (int n)
{
int f=1;
while (n > 1){
f = f * n;
n = n - 1;
}
return f;
}
13. SWIG:COMPARACION PYTHON-C
El contenido de arit.c El contenido de arit.i quedaria
quedaria como sigue : como sigue :
%module arit
int suma(int a, int b)
%{
{
extern int suma(int a, int b);
return a+b;
int fact (int n);
}
%}
int fact (int n)
extern int suma(int a, int b);
{
int fact (int n);
14. SWIG:COMPARACION PYTHON-C
Para agilizar el proceso de crearemos un script
(make_arit.sh) que se encargara de todo el
proceso : #!/bin/sh -e
echo ' '
echo 'Creando Modulo arit'
swig -python arit.i
gcc -c arit.c arit_wrap.c -I/usr/include/python2.6
ld -shared arit.o arit_wrap.o -o _arit.so
echo 'Modulo arit: CREADO'
echo ' '
Le damos permisos de ejecucion
chmod +x make_arit.sh
15. SWIG:COMPARACION PYTHON-C
En Resumen los archivos necesarios para la
creacion de este module serian:
●arit.c
●arit.i
●make_arit.sh
La ejecucion del script :
./make_arit
16. SWIG:COMPARACION PYTHON-C
fact.py: versus.py
#!/usr/bin/python
def fact(n): import fact, arit, time
f=1
pyfact = fact.fact
while n > 1:
cfact = arit.fact
f=f*n
n=n-1 # Medimos la velocidad de
return f cfact
start = time.time()
cfact(20)
18. SWIG : 2º EJEMPLO
example.i File : example.c
%module example
%{ #include <time.h>
double My_variable =
extern double 3.0;
My_variable;
extern int fact(int n); int fact(int n) {
extern int my_mod(int if (n <= 1) return 1;
x, int y); else return n*fact(n-
extern char *get_time(); 1);
19. SWIG : 2º EJEMPLO
Para agilizar el proceso de crearemos un script
(make_arit.sh) que se encargara de todo el
proceso :
#!/bin/sh -e
echo ' '
echo 'Creando Modulo example'
swig -python example.i
gcc -c example.c example_wrap.c -I/usr/include/python2.6
ld -shared example.o example_wrap.o -o _example.so
echo 'Modulo example: CREADO'
echo ' '
Le damos permisos de ejecucion
chmod +x make_example.sh
20. SWIG : 3º EJEMPLO
example.h example.c
extern double Base ; #include " example . h"
int fact ( int n ) ; double Base = 4.0 ;
int fact ( int n )
{
if ( n<=1 ) return 1 ;
else return n*fact( n−1);
}
21. SWIG : 3º EJEMPLO
example.i
%module example
%{
#include " example . h"
%}
%include " example . h"