Usando librerías adicionales y virtualenv
|
Author: Tomas Zulberti |
Los temas sobre los que voy a hablar son:
- La librería estándar de Python
- ¿Qué hacer cuando algo no esta en en la librería?
- Instalando librerías adicionales
- Usar virtualenv para solucionar los problemas que aparecen
Python viene con cerca de 350 librerías para usar. http://docs.python.org/library/index.html
Tienen de todo:
- Trabajar con mails
- Fetchear paginas
- Interactuar con el sistema operativo
- Trabajar con archivos comprimidos
- Parsear diferentes tipos de documentos (xml, json, etc..)
MUCHAS COSAS MAS....
Antes que nada, veamos algunos ejemplos de cosas que se pueden hacer con las pilas que trae Python.
Enviamos un mail usando una cuenta de GMail
>>> import smtplib >>> from email.MIMEText import MIMEText >>> USERNAME = "tzulberti@gmail.com" # Aca tienen que poner su usuario >>> PASSWORD = "no se los voy a decier" # Aca ponen su passsword >>> mailServer = smtplib.SMTP('smtp.gmail.com',587) >>> mailServer.ehlo() >>> mailServer.starttls() >>> mailServer.ehlo() >>> mailServer.login(USUARIO, PASSWORD) >>> msg = MIMEText(" Este es el contenido del mail... ") >>> msg['From'] = USERNAME >>> msg['To'] = USERNAME >>> msg['Subject'] = "Este es el sujeto" >>> mailServer.sendmail("tzulberti@gmail.com", "tzulberti@gmail.com", msg.as_string())
Leemos una pagina web para leer el contenido de la misma.
>>> from urllib2 import urlopen >>> response = urlopen("http://python.org.ar/pyar/") >>> contenido_html = response.read() >>> print contenido_html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <link rel="icon" href="/images/pyar.ico" type="image/ico"> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <meta name="keywords" content="Python, PyAr, Python Argentina, user group, grupo de usuarios, community portal"> <meta name="robots" content="index,follow"> <title>Inicio - PyAr - Python Argentina</title> <script type="text/javascript" src="/moin_static182/common/js/common.js"></script>
Trabajamos con archivos comprimidos
>>> import zipfile >>> archivo_comprimido = zipfile.ZipFile("EL_ARHIVO.zip", "r") >>> for name in archivo_comprimido.namelist(): ... print name >>> archivo_comprimido.extract()
Pero la librería de python no tiene todo:
- No sabe leer algunos algunos formatos de archivos (yaml, mp3, vídeo)
- Frameworks web (pylons, django, web2py)
- Usar API de Youtube, Deliciosus, etc....
Vimos que la librería estándar puede hacer varias cosas, pero hay cosas que son mas fáciles si se usan librerías hechos por otras personas:
- Los frameworks permiten ahorrar cierto trabajo repetitivo.
- Las interfaces a la API nos ahorran el hecho de tener que leer la documentación de las mismas
- Aunque Python sabe leer archivos de texto y binarios, es mas fácil que directamente convierta ciertos formatos de archivos a estructuras de python.
¿Dónde buscar librerías que no esten en python?
Hay cerca de 11.000 librerías para usar. Como se vio en la charla de Roberto Alsina (import antigravity), hay para hacer de todo:
- Colorear la consola
- Alternativas a la consola de python (bpython, ipython)
- Trabajar con formatos de archivos raros
- Bajar archivos de cuevana
- Bajar videos de youtube
- Parsear xmls usando una sintaxis parecida a jQuery
- MUCHO MAS COSAS
¿Cómo instalamos los paquetes de PyPi?
Primero necesitan instalar python-setuptools
Esto depende del sistema operativo:
- Ubuntu:
apt-get install python-setuptools
- Windows: tienen un .exe a bajarse desde acá:
http://pypi.python.org/pypi/setuptools/0.6c11#windows
Los paquetes en Python generalmente se distribuyen bajo un archivo .egg. Estos archivos son un archivo zip (con otra extensión) que:
- Tienen el código
- Tienen otros archivos (imagenes, sonido, docuementación, etc..)
- Tienen un archivo muy importante de metada: setup.py
- Para instalar los .egg necesitan instalar primero un modulo llamado setuptools.
Una vez que instalan el modulo setuptools, van a tener disponible el comando easy_install.
easy_install nombreLibreria
Por ejemplo:
- easy_install django
- easy_install yaml
- easy_install pylons==1.0
- easy_install -U rst2pdf
Algo importante a tener en cuenta es que el comando easy_install también instala todas las dependencias. Por ejemplo, rst2pdf depende de Pygments y reportlab. Si se ejecuta:
easy_install rst2pdf
Entonces también se van a instalar reportlab, y Pygments. Para los que usan Ubuntu, easy_install funciona como apt-get.
Existe una alternativa a easy_install llamada pip. Recomiendo usar esa opción.
easy_install pip
Se puede hacer todo lo que se hacia con easy_install, y también hace mas cosas:
- Hacer búsquedas en pypi
pip search rst2pdf
- Desinstalar paquetes
pip uninstall rst2pdf
- Listar las librerías instaladas
pip freeze
- Instalar todas las paquetes que está en un archivo
pip freeze > archivoConLibrerias.txt pip install -r archivoConLibrerias.txt
Por ejemplo:
- pip install django
- pip install -U rst2pdf
Sin embargo existen algunos problemas:
Es necesario ser admin/root. Es fácil cuando uno esta desarrollando, pero poco probable en producción.
No se pueden instalar dos versiones de la misma paquete.
Esto es importante cuando la paquete no es compatible para atrás. Algunos ejemplos son:
- SQLAlchemy
- django
Por ejemplo, las aplicaciones que funcionan con django 0.9.7 no funcionan con django 1.2, y viceversa. Por como funciona el sistema de paquetes de Python, el mismo solo permite tener instalado una única versión de un mismo paquete.
Por lo tanto, uno tiene que elegir que versión del paquete usar.
Usando virtualenv
Para solucionar estos problemas existe virtualenv. El mismo se encarga de crear un entorno aislado del entorno de Python del sistema. Para eso es necesario instalarlo:
easy_install virtualenv
Es una única vez que van a necesitar ser root/admin para instalar una librería. Lo traen todos los servidores que usan permiten hostear proyectos en python.
Sino se tiene permiso de root/administrador, también se lo puede usar sin instalarlo en el sistema. Para eso se bajan el comprimido desde:
http://pypi.python.org/pypi/virtualenv
Una vez instalado, lo primero que hay que hacer es crear un entorno virtual:
virtualenv nombreEntorno
Esto va a crear una carpeta nombreEntorno en donde estemos parados. Si no lo instalaron en el sistema, y se bajaron el archivo comprimido, entonces
python virtualenv.py nombreEntorno
El comando anterior creo un entorno de Python que esta separado de la configuración del sistema global. Por lo tanto, uno hay no tiene problemas de permiso porque esto lo puede crear en su carpeta.
Para decirle al sistema operativo que queremos usar el entorno creado, y no el del sistema, es necesario activar el entorno.
Linux:
source nombreEntorno/bin/activate
Windows:
nombreEntorno\Scripts\activate.bat
Tanto en windows como en linux, cuando activen en entorno, les va a aparecer el nombre del entorno activado entre paréntesis:
(nombreEntorno)tzulberti@myhost:~
Cuando uno tiene en entorno activado, uno puede ver que el python que usa no es el global, sino que es esta dentro de la carpeta que creo virtualenv, y no el del sistema global
(nombreEntorno)tzulberti@myhost:which python /home/tzulberti/nombreEntorno/bin/python
Lo mismo pasa con el easy_install y pip. También, todos los paquetes que se instalen se van a instalar dentro del entorno creado.
Para dejar de usar el entorno lo que tenemos que hacer es:
Linux:
deactive
Windows:
nombreEntorno\Scripts\deactivate.bat
¿Cómo funciona virtualenv?
Cuando uno crea un entorno, dentro del mismo se crean tres carpetas:
- bin: cuando uno tiene el entorno activado, y ejecuta un comando como python, pip o easy_install, se ejecuta alguno de los binarios que se encuentran en esa carpeta, en vez de ejecutar los del sistema.
- include: es simplemente un link al a los archivos de la instalación de Python.
- lib: esta es otra carpeta importante. Al igual que include tiene una carpeta llamada
python pero a diferencia de include, esta no es una link a la carpeta de Python.
La carpeta tiene dos cosas importantes:
- Un link a algunos archivos de Python. En este caso a los .py
- Una carpeta, site-packages, que es donde se instalan los paquetes cuando uno usa pip o easy_install
¿Preguntas y respuestas? (Parte I)
Anteriormente comente que uno de los problemas que teníamos era que no se podían instalar dos versiones de la misma librería. Lo que nunca hice fue comentar como se soluciona ese problema.
La solución es fácil. Se crea un entorno para usar con django 0.97, y otro para usar con 1.2. Se pueden crear todos los entornos que uno quiera, y son aislados entre si.
Para los servidores de producción, hay configuraciones se puede configurar el apache para que use cierto entorno virtual.
¿Preguntas y respuestas? (Parte II)
Creo un virtualenv, lo activo, y hago pip freeze, y me aparecen cosas que nunca instale en el entorno.
El comportamiento predeterminado de virutalenv cuando se crea un entorno, es también crearlo con los paquetes que uno tiene instalado en el sistema. Para que no haga eso, cuando se crea el entorno, se puede hacer:
virtualenv --no-site-packages nombreEntorno
Eso hace que cree un entorno totalmente vació. Por último, otra opción a tener en cuenta es --python, que hace que el entorno virtual use esa versión de python (para eso es necesario tener instalado esa version de Python). Por ejemplo, en mi maquina tengo instalado Python 2.7 y 3.1, siendo el 2.7 el predeterminado.
Luego, cuando se cree un entorno, lo va a crear usando Python 2.7. Para que en el entorno se use Python 3.1, se tiene que hacer:
virtualenv --python=python3.1 nombreEntorno
¿Preguntas y respuestas? (Parte III)
Hay ciertos paquetes que tienen código escrito en C. ¿Qué pasa con las mismas?
En esos casos pip o easy_install van a intentar compilar el código escrito en C, cuando uno lo instala. En distribuciones como Ubuntu, recomiendo instalar:
- build-essential
- python-dev
Esos dos paquetes facilitan mucho la compilación.
Sin embargo, en Windows no es tan feliz la cosa. Varios de los paquetes que tienen código en C, se distribuyen también en .exe. Sin embargo, los instaladores no permiten seleccionar donde instalar las mismas. Acá http://www.developerzen.com/2010/09/23/the-complete-guide-to-setting-up-python-development-environment-on-windows/ hay una MUY buena guia de como hacer para que compile los paquetes cuando los baje.
¿Preguntas y respuestas? (Parte IV)
¿Recomendas instalar los paquete del sistema o usando easy_install?
Hay que tener en cuenta que varias distribuciones traen varios paquetes de python que se pueden instalar en el sistema. Por ejemplo:
apt-get python-numpy python-reportlab python-pil
Pero las versiones que se pueden instalar por apt-get están desactualizadas. Acá vemos algunos ejemplos comparativos de versiones:
| Nombre del paquete | Versión de Ubuntu 10.10 | Versión de Pypi |
|---|---|---|
| rst2pdf | 0.14.2 | 0.16 |
| reportlab | 2.4.3 | 2.5 |
| django | 1.2.3 | 1.2.3 |
Por lo tanto, depende de lo que uno quiera hacer. Por ejemplo, si uno quiere hacer un programa que funcione con Ubuntu, entonces puede crear un entorno virtual e instalar las mismas versiones que con apt-get o directamente instalar las global
Lo que NO recomiendo es sobre escribir la versión instalada. Por ejemplo, si uno hace:
apt-get python-reportlab
Entonces no tiene que hacer:
easy_install -U reportlab
Sin usar un entorno virtual porque puede romper algo del sistema.
Help PET: Donate
blog comments powered by Disqus