iniciacion_python_modulos.pdf
TRANSCRIPT
Módulos y paquetes en Python
Curso de Iniciación a Python
porCésar Husillos y Víctor Terrón
MODULOS
● ¿Qué son?● ¿Para qué se usan?● ¿Cómo se usan?
Definición
● Un módulo se define como un fichero que contiene instrucciones de Python– Variables
– Funciones
– Clases
– Código ejecutable
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
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.
Ejemplo de módulo: areas.py#!/usr/bin/env python
# * coding: utf8 *
"""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)
¿Cómo se usan?
● La instrucción más básica es
import nombre_modulo
>>> import areas
Area cuadrado = 4
Area circulo = 3.1416
>>>
¿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.
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)
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.
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'?
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.
¿Problemas al importar?
>>> import areas
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named areas
>>>
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.
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
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/distpackages' '/usr/local/lib/python2.7/distpackages/pytz2011jpy2.7.egg', …]
● Puede no resultar conveniente.
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
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
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')
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
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
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.
Colisión de nombres
>>> import areas
>>> pi = 1.45
>>> pi
1.45
>>> areas.pi
3.1416
>>> from areas import *
>>> pi
3.1416
>>>
PAQUETES
● ¿Qué son?● ¿Para qué se usan?● ¿Cómo se usan?
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.
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 *
Ejemplo de paquete
● figuras– __init__.py
– espacio● __init__.py● volumenes.py
– plano● __init__.py● areas.py● perimetros.py
Paquete figuras
● El fichero figuras/__init__.py contiene la linea
PI = 3.1416● El fichero figuras/plano/__init__.py
contiene
__all__ = ['areas', 'perimetros']
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.
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)
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
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)
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
>>>
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?
Separando la parte ejecutable de la parte importable#!/usr/bin/env python
# * coding: utf8 *
"""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)
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)
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)
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$
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.
Ejemplo: argumentos.py
#!/usr/env python
# -*- coding: utf-8 -*-
import sys
if __name__ == '__main__':
print sys.argv
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)