Clase5_Python-CTIC

23
PYTHON Universidad Nacional de Ingenieria Centro de Tecnologias de Informacion y Comunicaciones Facultad de Ciencias Abraham Zamudio Ch.

Transcript of Clase5_Python-CTIC

Page 1: Clase5_Python-CTIC

PYTHON Universidad Nacional de

Ingenieria

Centro de Tecnologias de Informacion y

Comunicaciones

Facultad de Ciencias

Abraham Zamudio Ch.

Page 2: Clase5_Python-CTIC

PYTHON

Clase 5

Abraham Zamudio Ch.

[email protected]

Page 3: Clase5_Python-CTIC

SWIGHoy 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

Page 4: Clase5_Python-CTIC

Modulos en C para PYTHON

BindingsUn 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

Page 5: Clase5_Python-CTIC

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).

Page 6: Clase5_Python-CTIC

SWIG : 1º EJEMPLO

Digamos que tenemos una función en C llamada

suma(a, b) que devuelve la suma de los dos números que le pasamos como argumentos. Veremos como la función suma puede hacerse accesible para Python. Crearemos un archivo llamado arit.c que contiene el siguiente código:

// arit.c

int suma(int a, int b){return a+b;}

Page 7: Clase5_Python-CTIC

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 aritQue declara el nombre del modulo y debe ser igual al nombre del archivo .c (arit.c)

Page 8: Clase5_Python-CTIC

SWIG : 1º EJEMPLO

Este nombre será exportado a cada lenguaje de manera que se corresponda con la estructura de organización que en él exista. En el caso de Python el nombre del módulo se corresponderá con un paquete.

//arit.i %module arit %{extern int suma(int a, int b); %}

extern int suma(int a, int b);

Page 9: Clase5_Python-CTIC

SWIG : 1º EJEMPLOAhora 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

Page 10: Clase5_Python-CTIC

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

Page 11: Clase5_Python-CTIC

SWIG : 1º EJEMPLO

Si ejecutamos python :

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) [GCC 4.3.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import arit>>> arit.suma(12,13)25>>>

Page 12: Clase5_Python-CTIC

SWIG:COMPARACION PYTHON-CVamos 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;

}

Page 13: Clase5_Python-CTIC

SWIG:COMPARACION PYTHON-C

El contenido de arit.c quedaria como sigue :

int suma(int a, int b){

return a+b;}

int fact (int n){

int f=1;while (n > 1){

f = f * n;n = n - 1;

}

return f;}

El contenido de arit.i quedaria como sigue :

%module arit %{

extern int suma(int a, int b);int fact (int n); %}

extern int suma(int a, int b);int fact (int n);

Page 14: Clase5_Python-CTIC

SWIG:COMPARACION PYTHON-C

Para agilizar el proceso de crearemos un script (make_arit.sh) que se encargara de todo el proceso :

Le damos permisos de ejecucionchmod +x make_arit.sh

#!/bin/sh -eecho ' 'echo 'Creando Modulo arit'swig -python arit.igcc -c arit.c arit_wrap.c -I/usr/include/python2.6ld -shared arit.o arit_wrap.o -o _arit.soecho 'Modulo arit: CREADO'echo ' '

Page 15: Clase5_Python-CTIC

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

Page 16: Clase5_Python-CTIC

SWIG:COMPARACION PYTHON-C

fact.py:

def fact(n):f = 1while n > 1:

f = f * nn = n - 1

return f

versus.py#!/usr/bin/pythonimport fact, arit, time

pyfact = fact.factcfact = arit.fact

# Medimos la velocidad de cfact

start = time.time()cfact(20)end = time.time()print "La funcion factorial en C tardo", end-start, "segundos"

start = time.time()pyfact(20)end = time.time()

print 'La funcion factorial en Python tardo', end-start, 'segundos'

Page 17: Clase5_Python-CTIC

SWIG:COMPARACION PYTHON-C

python versus.py

La funcion factorial en C tardo 3.09944152832e-06 segundos

La funcion factorial en Python tardo 1.59740447998e-05 segundos

Page 18: Clase5_Python-CTIC

SWIG : 2º EJEMPLO

example.i %module example %{ extern double My_variable; extern int fact(int n); extern int my_mod(int x, int y); extern char *get_time(); %} extern double My_variable; extern int fact(int n); extern int my_mod(int x, int y); extern char *get_time();

File : example.c #include <time.h> double My_variable = 3.0; int fact(int n) { if (n <= 1) return 1; else return n*fact(n-1); } int my_mod(int x, int y) { return (x%y); } char *get_time() { time_t ltime; time(&ltime); return ctime(&ltime); }

Page 19: Clase5_Python-CTIC

SWIG : 2º EJEMPLO

Para agilizar el proceso de crearemos un script (make_arit.sh) que se encargara de todo el proceso :

Le damos permisos de ejecucionchmod +x make_example.sh

#!/bin/sh -eecho ' 'echo 'Creando Modulo example'swig -python example.igcc -c example.c example_wrap.c -I/usr/include/python2.6ld -shared example.o example_wrap.o -o _example.soecho 'Modulo example: CREADO'echo ' '

Page 20: Clase5_Python-CTIC

SWIG : 3º EJEMPLO

example.hextern double Base ;int fact ( int n ) ;

example.c#include " example . h"double Base = 4.0 ;int fact ( int n ){if ( n<=1 ) return 1 ;else return n*fact( n−1);}

Page 21: Clase5_Python-CTIC

SWIG : 3º EJEMPLO

example.i

%module example%{#include " example . h"%}%include " example . h"

Page 22: Clase5_Python-CTIC

SWIG : 3º EJEMPLO

#!/bin/sh -eecho ' 'echo 'Creando Modulo example3'swig -python example3.igcc -c example3.c example3_wrap.c -I/usr/include/python2.6ld -shared example3.o example3_wrap.o -o _example3.soecho 'Modulo example3: CREADO'echo ' 'echo 'Funcionamiento : example3 'python -c "import example3; print example3.fact(5)"python -c "import example3; print example3.cvar.Base"

make_example3.sh

Page 23: Clase5_Python-CTIC

Flujo de Ficheros : SWIG