iniciacion_python_modulos.pdf

42
Módulos y paquetes en Python Curso de Iniciación a Python por César Husillos y Víctor Terrón

Upload: juanaves

Post on 29-Nov-2015

11 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Iniciacion_Python_Modulos.pdf

Módulos y paquetes en Python

Curso de Iniciación a Python

porCésar Husillos y Víctor Terrón

Page 2: Iniciacion_Python_Modulos.pdf

MODULOS

● ¿Qué son?● ¿Para qué se usan?● ¿Cómo se usan?

Page 3: Iniciacion_Python_Modulos.pdf

Definición

● Un módulo se define como un fichero que contiene instrucciones de Python– Variables

– Funciones

– Clases

– Código ejecutable

Page 4: Iniciacion_Python_Modulos.pdf

Utilidad de los módulos

REUTILIZACIÓN

● Podemos usar en otros programas– Funciones.

– Variables.

– Clases.

definidas en otros módulos que son– Eficientes

– Útiles

– Probados

Page 5: Iniciacion_Python_Modulos.pdf

Creación

● Es un proceso tan sencillo como generar un fichero de texto y escribir instrucciones en Python.

● Este fichero debe estar en la lista de rutas que Python consulta para la carga de módulos.

Page 6: Iniciacion_Python_Modulos.pdf

Ejemplo de módulo: areas.py#!/usr/bin/env python

# ­*­ coding: utf­8 ­*­

"""Modulo para el calculo de areas de formas basicas"""

pi = 3.1416

def cuadrado(lado):

   """Calcula el area del cuadrado a partir de su lado"""

    return lado ** 2

def circulo(radio):

"""Calcula el area del circulo dado el radio"""

    return pi * radio ** 2

print 'Area cuadrado =', cuadrado(2)

print 'Area circulo =', circulo(1)

Page 7: Iniciacion_Python_Modulos.pdf

¿Cómo se usan?

● La instrucción más básica es

import nombre_modulo

>>> import areas

Area cuadrado = 4

Area circulo = 3.1416

>>>

Page 8: Iniciacion_Python_Modulos.pdf

¿Qué he importado?

>>> dir(areas)

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'circulo', 'cuadrado', 'pi']

>>>

● Las variables con prefijo '__' son internas al módulo. Proporcionan información.

Page 9: Iniciacion_Python_Modulos.pdf

Información del módulo

>>> areas.__doc__

'Modulo para el calculo de areas de formas basicas'

>>> areas.__file__

'areas.py'

>>> areas.__name__

'areas'

>>> areas.__package__

>>> help(areas.circulo)

Help on function circulo in module areas:

circulo(radio)

    Calcula el area del circulo dado el radio

(END)

Page 10: Iniciacion_Python_Modulos.pdf

Re-importar un módulo● No tiene efecto

>> import areas

Area cuadrado = 4

Area circulo = 3.1416

>> import areas

>> areas.cuadrado(2)

4● AVISO: Si he hecho cambios entre la primera y la segunda

importación, ¡no se tienen en cuenta!.● Los módulos sólo se cargan una vez.

Page 11: Iniciacion_Python_Modulos.pdf

Recarga de un módulo

● Mediante la función reload()

>>> reload(areas)

Area cuadrado = 4

Area circulo = 3.1416

<module 'areas' from 'areas.pyc'>

>>> ● ¿Qué es ese fichero 'areas.pyc'?

Page 12: Iniciacion_Python_Modulos.pdf

Fichero .pyc● Este fichero lo genera Python de forma automática al importar un módulo.● Es un código precompilado que acelera la carga del módulo.● Puede borrarse sin problema. Al importar, se genera de nuevo.● Cuando se modifica el módulo, al importarlo de nuevo se genera una nueva versión de .pyc.

Page 13: Iniciacion_Python_Modulos.pdf

¿Problemas al importar?

>>> import areas

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ImportError: No module named areas

>>> 

Page 14: Iniciacion_Python_Modulos.pdf

Directorios de módulos

● Cuando se importa módulos Python busca– En el directorio actual.

– En las rutas contenidas en la variable PYTHONPATH.

– Directorios de la instalación de PYTHON.

Page 15: Iniciacion_Python_Modulos.pdf

Módulos accesibles

● Para importar, podemos poner nuestros módulos en el directorio actual– PROBLEMA: cambio de directorio de trabajo

● ¿Copio los módulos de un directorio a otro?– Poco eficiente– Costoso de sincronizar

Page 16: Iniciacion_Python_Modulos.pdf

Módulos accesibles● Copio mis módulos al directorio de la instalación de Python

>>> import sys

>>> sys.path

['',  '/usr/lib/python2.7', '/usr/local/lib/python2.7/dist­packages' '/usr/local/lib/python2.7/dist­packages/pytz­2011j­py2.7.egg', …]

● Puede no resultar conveniente.

Page 17: Iniciacion_Python_Modulos.pdf

Módulos accesibles

● Agrego un directorio donde guardo mis módulos a la ruta de búsqueda de Python.

● Dos posibilidades:– Estática: mediante edición de la variable PYTHONPATH

– Dinámica: accediendo a las variable path del módulo sys

Page 18: Iniciacion_Python_Modulos.pdf

PYTHONPATH● En windows:

– Inicio → Equipo (botón derecho) → Propiedades → Configuración avanzada del sistema → Variables de entorno → Editar/Nueva (Variables del sistema)

● PYTHONPATH=C:\Users\...\dir_modulos1;C:\Users\...\dir_modulos2

● En LINUX (BASH)– Editamos el fichero $HOME/.bashrc, agregando una línea para la

nueva variable de entorno (si no existe)● PYTHONPATH=$HOME/dir_modulos1:$HOME/dir_modulos2

Page 19: Iniciacion_Python_Modulos.pdf

sys.path

● Modificando la variable path del módulo sys– Windows

>>> import sys

>>> sys.path.append('C:\\Users\\Pepe\\dir_modulos1')– Linux

>>> import sys

>>> sys.path.append('/home/pepe/dir_modulos1')

Page 20: Iniciacion_Python_Modulos.pdf

Otras instrucciones para importar modulos● from paquete/modulo import modulo/variable/función

>>> from areas import circulo

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__', 'circulo']

>>> circulo(1)

3.1416 

Page 21: Iniciacion_Python_Modulos.pdf

Otras instrucciones para importar módulos●import modulo as alias>>> import areas as a

>>> dir(a)

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'circulo', 'cuadrado', 'pi']

>>> a.circulo(1)

3.1416

Page 22: Iniciacion_Python_Modulos.pdf

Otras instrucciones para importar módulos● from modulo import *

– Importa todo el contenido del módulo.

– Es peligroso, porque puede producir colisión de nombres entre lo definido en el módulo y el código que lo importa.

Page 23: Iniciacion_Python_Modulos.pdf

Colisión de nombres

>>> import areas

>>> pi = 1.45

>>> pi

1.45

>>> areas.pi

3.1416

>>> from areas import *

>>> pi

3.1416

>>> 

Page 24: Iniciacion_Python_Modulos.pdf

PAQUETES

● ¿Qué son?● ¿Para qué se usan?● ¿Cómo se usan?

Page 25: Iniciacion_Python_Modulos.pdf

Paquetes

● Es una forma de organizar módulos– Si modulo → fichero

– Entonces paquete → directorio

● Un paquete se maneja básicamente como si fuera un módulo.

● Lo interesante es que puede contener otros módulos.

Page 26: Iniciacion_Python_Modulos.pdf

Creación de paquetes

● Necesitamos un directorio

● Que el directorio contenga el fichero: __init__.py– Este fichero puede contener cualquier código

● Podemos poner otros módulos o paquetes (subdirectorios) dentro del directorio.

● Podemos incluir la lista especial llamada __all__ en el fichero __init__.py. En ella introduciremos los módulos del paquete que se cargarán al escribir

>>> from paquete import *

Page 27: Iniciacion_Python_Modulos.pdf

Ejemplo de paquete

● figuras– __init__.py

– espacio● __init__.py● volumenes.py

– plano● __init__.py● areas.py● perimetros.py

Page 28: Iniciacion_Python_Modulos.pdf

Paquete figuras

● El fichero figuras/__init__.py contiene la linea

PI = 3.1416● El fichero figuras/plano/__init__.py

contiene

__all__ = ['areas', 'perimetros']

Page 29: Iniciacion_Python_Modulos.pdf

Usando el paquete figuras● Agregar el directorio que contiene el paquete a la ruta de Python

(por cualquiera de los métodos explicados).

>>> import sys

>>> sys.path.append('ruta_al_directorio/figuras')

● Importar lo que interesa● IMPORTANTE: importar un paquete no da acceso a los subpaquetes ni a

los módulos que contiene. Hay que importar de forma explícita en código.

Page 30: Iniciacion_Python_Modulos.pdf

Usando el paquete figuras>>> import figuras

>>> help(figuras)

Help on package figuras:

NAME

    figuras

FILE

    /home/cesar/figuras/__init__.py

PACKAGE CONTENTS

    espacio (package)

    plano (package)

DATA

    PI = 3.141592

(END)

Page 31: Iniciacion_Python_Modulos.pdf

Usando el paquete figuras>>> import figuras.plano.perimetros

Perimetro cuadrado = 8

Longitud circunferencia = 6.2832

>>> figuras.plano.perimetros.cuadrado(3)

12

>>> import figuras.plano.areas as a

Area cuadrado = 4

Area circulo = 3.1416

>>> a.circulo(1)

3.1416

>>> from figuras.espacio import volumenes

Volumen cubo = 8

Volumen esfera = 4.1888

>>> volumenes.cubo(1)

1

Page 32: Iniciacion_Python_Modulos.pdf

Usando el paquete figuras>>> import figuras.plano.areas as a

>>> help(a) 

Help on module figuras.plano.areas in figuras.plano:

NAME

    figuras.plano.areas ­ Modulo para el calculo de areas de formas basicas

FILE

    /home/cesar/figuras/plano/areas.py

FUNCTIONS

    circulo(radio)

        Calcula el area del circulo dado el radio

    

    cuadrado(lado)

        Calcula el area del cuadrado a partir de su lado

DATA

    pi = 3.1416

(END)

Page 33: Iniciacion_Python_Modulos.pdf

Importando todo de paquete● Siguiendo nuestro ejemplo

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__']

>>> import sys

>>> sys.path.append('ruta_al_directorio/figuras')

>>> from figuras.plano import *

>>> dir()

Perimetro cuadrado = 8

Longitud circunferencia = 6.2832

>>> dir()

['__builtins__', '__doc__', '__name__', '__package__', 'areas', 'perimetros', 'sys']

>>> perimetros.cuadrado(1)

4

>>>

Page 34: Iniciacion_Python_Modulos.pdf

De vuelta a los módulos

● Los módulos se usan, principalmente para reutilizar el código.

● Puede resultar inútil o molesto que cada vez que se importa un módulo se ejecuten las instrucciones que contiene.

● ¿Cómo arreglamos eso?

Page 35: Iniciacion_Python_Modulos.pdf

Separando la parte ejecutable de la parte importable#!/usr/bin/env python

# ­*­ coding: utf­8 ­*­

"""Modulo para el calculo de areas de formas basicas"""

pi = 3.1416

def cuadrado(lado):

   """Calcula el area del cuadrado a partir de su lado"""

    return lado ** 2

def circulo(radio):

"""Calcula el area del circulo dado el radio"""

    return pi * radio ** 2

print 'Area cuadrado =', cuadrado(2)

print 'Area circulo =', circulo(1)

Page 36: Iniciacion_Python_Modulos.pdf

Separamos parte ejecutable de parte “importable”● Usamos la variable __name__

>> __name__

'__main__'

>> import areas

>> areas.__name__

'areas'

● Cuando ejecutamos un módulo desde el intérprete de comandos (python modulo.py), el valor de la variable __name__ vale '__main__'

● Cuando importantos el módulo, el valor de __name__ para ese módulo vale '__modulo__' (si el módulo se llama modulo.py)

Page 37: Iniciacion_Python_Modulos.pdf

Retocando el módulo areas.py

#!/usr/env python

# -*- coding: utf-8 -*-

"""Modulo para el calculo de areas de formas basicas"""

pi = 3.1416

def cuadrado(lado):

"""Calcula el area del cuadrado a partir de su lado"""

return lado ** 2

def circulo(radio):

"""Calcula el area del circulo dado el radio"""

return pi * radio ** 2

if __name__ == '__main__':

print 'Area cuadrado =', cuadrado(2)

print 'Area circulo =', circulo(1)

Page 38: Iniciacion_Python_Modulos.pdf

Retocando el módulo areas.py● Desde el intérprete de Python

>>> import areas

>>>● Desde línea de comandos

cesar@hulk:~/figuras/plano$ python areas.py

Area cuadrado = 4

Area circulo = 3.1416

cesar@hulk:~/figuras/plano$

Page 39: Iniciacion_Python_Modulos.pdf

Vuelta de tuerca: Paso de parámetros a módulos● Podemos ejecutar un módulo desde línea

de comandos pasándole parámetros.

python modulo.py argum1 argum2● Basta retocar mínimamente el módulo:

– Importando el módulo sys de la librería estándar

– Haciendo uso de la lista argv de sys.

Page 40: Iniciacion_Python_Modulos.pdf

Ejemplo: argumentos.py

#!/usr/env python

# -*- coding: utf-8 -*-

import sys

if __name__ == '__main__':

print sys.argv

Page 41: Iniciacion_Python_Modulos.pdf

Ejecutando argumentos.pycesar@hulk:~$ python argumentos.py 1 2.0 hola

['argumentos.py', '1', '2.0', 'hola']

● Al imprimir sys.argv vemos que:

– es una lista– El primer elemento es el nombre del módulo– Todos los argumentos son cadenas de caracteres (habrá

que transformar el tipo donde sea necesario)

Page 42: Iniciacion_Python_Modulos.pdf

Ejercicios

http://www.iaa.es/python/ejercicios