SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
PYTHON
  Universidad Nacional de
         Ingenieria

  Centro de Tecnologias de
       Informacion y
      Comunicaciones

   Facultad de Ciencias

   Abraham Zamudio Ch.
PYTHON

       Clase 5

Abraham Zamudio Ch.

abraham.zamudio@gmail.com
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
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
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).
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
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)
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.
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
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
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
>>>
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;
}
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);
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
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
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)
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
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);
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
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);
                       }
SWIG : 3º EJEMPLO


example.i


%module example
%{
#include " example . h"
%}
%include " example . h"
SWIG : 3º EJEMPLO

           make_example3.sh
#!/bin/sh -e
echo ' '
echo 'Creando Modulo example3'
swig -python example3.i
gcc -c example3.c example3_wrap.c -I/usr/include/python2.6
ld -shared example3.o example3_wrap.o -o _example3.so
echo 'Modulo example3: CREADO'
echo ' '
echo 'Funcionamiento : example3 '
python -c "import example3; print example3.fact(5)"
python -c "import example3; print example3.cvar.Base"
Flujo de Ficheros : SWIG

Mais conteúdo relacionado

Semelhante a Clase5_Python-CTIC

C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
deer hope
 
Lecture7
Lecture7Lecture7
Lecture7
orgil
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de Mainsonneuve
Philippe Gamache
 
Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open Source
Sergio Alonso
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶
wensheng wei
 

Semelhante a Clase5_Python-CTIC (15)

Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
 
Qt编程介绍
Qt编程介绍Qt编程介绍
Qt编程介绍
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
programming camp 2008, introduction of git
programming camp 2008, introduction of gitprogramming camp 2008, introduction of git
programming camp 2008, introduction of git
 
Lecture7
Lecture7Lecture7
Lecture7
 
FISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de DatacentersFISL11 2010 - Automação de Datacenters
FISL11 2010 - Automação de Datacenters
 
Programació de sockets amb C++
Programació de sockets amb C++Programació de sockets amb C++
Programació de sockets amb C++
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de Mainsonneuve
 
Vpn gw2gw
Vpn gw2gwVpn gw2gw
Vpn gw2gw
 
Seminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open SourceSeminario Ruby On Rails Aula Open Source
Seminario Ruby On Rails Aula Open Source
 
TYPO3 TypoScript: IF, CASE, CONDITIONS
TYPO3 TypoScript: IF, CASE, CONDITIONSTYPO3 TypoScript: IF, CASE, CONDITIONS
TYPO3 TypoScript: IF, CASE, CONDITIONS
 
Gc3pie
Gc3pieGc3pie
Gc3pie
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶
 
20100925 sola-android
20100925 sola-android20100925 sola-android
20100925 sola-android
 

Mais de Abraham Zamudio (10)

Paralela5
Paralela5Paralela5
Paralela5
 
Paralela6
Paralela6Paralela6
Paralela6
 
Paralela4
Paralela4Paralela4
Paralela4
 
Paralela3
Paralela3Paralela3
Paralela3
 
Paralela10
Paralela10Paralela10
Paralela10
 
Paralela9
Paralela9Paralela9
Paralela9
 
Paralela8
Paralela8Paralela8
Paralela8
 
Paralela7
Paralela7Paralela7
Paralela7
 
Paralela1
Paralela1Paralela1
Paralela1
 
Paralela2
Paralela2Paralela2
Paralela2
 

Clase5_Python-CTIC

  • 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)
  • 17. 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
  • 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"
  • 22. SWIG : 3º EJEMPLO make_example3.sh #!/bin/sh -e echo ' ' echo 'Creando Modulo example3' swig -python example3.i gcc -c example3.c example3_wrap.c -I/usr/include/python2.6 ld -shared example3.o example3_wrap.o -o _example3.so echo 'Modulo example3: CREADO' echo ' ' echo 'Funcionamiento : example3 ' python -c "import example3; print example3.fact(5)" python -c "import example3; print example3.cvar.Base"