virtualevn para todos

Una de las cosas que me traje del último pyday en Córdoba de fin de abril, fue la idea de empezar a usar virtualenv.

Virtualenv es un software que virtualizar entornos python. Esto permite tener distintas configuraciones sin romper la dependencia de paquetes entre los distintos proyectos. Permite tener distintas versiones de paquetes instalados y sobre todo para cuando necesitamos instalar paquetes, no tenemos permisos de root y tenemos que andar rogando al sysadmin que los instale.

A continuación unas notas de instalación y uso. Fueron hechas usando ubuntu, pero son similares en debian y parecidas en cualquier otro linux. Para los demás, vean la doc oficial de virtualenv.

Instalando

Lo primero es instalar virtualenv y pip para instalar los paquetes dentro de nuestro entorno.

apt-get install python-virtualenv
apt-get install python-pip

Creando el entrono

Crearemos nuestro primer virtualenv en el directrio env,

patricio@plg:~/dev/python$ virtualenv --distribute --no-site-packages env/
New python executable in env/bin/python
Installing distribute........done.
Installing pip...............done.

Listo, tenemos una copia de nuestro python pelado en env/

Esto sería bueno hacerlo con cada uno de los proyectos que emprendamos.

Instalando paquetes

Para instalar paquetes desde fuera del entorno usamos la opción -E de pip. Por ejemplo, si queremos la última versión de django disponible en pypi:

patricio@plg:~/dev/python$ pip install -E env/ Django
Downloading/unpacking Django
  Downloading Django-1.3.tar.gz (6.5Mb): 6.5Mb downloaded
  Running setup.py egg_info for package Django
Installing collected packages: Django
  Running setup.py install for Django
    changing mode of build/scripts-2.6/django-admin.py from 644 to 755
    changing mode of /home/patricio/dev/python/env/bin/django-admin.py to 755
Successfully installed Django
Cleaning up...
patricio@plg:~/dev/python$

Activando y desactivando

Para activar el entorno usamos source, para desactivarlo, deactivate:

patricio@plg:~/dev/python$ source env/bin/activate
(env)patricio@plg:~/dev/python$
(env)patricio@plg:~/dev/python$ deactivate
patricio@plg:~/dev/python$

Turbulencias

Podemos llegar a tener complicaciones al instalar ciertos paquetes, que no son puramente python. Por ejemplo, al querer instalar MySql-python mediante pip, larga algunas excepciones.

Tenemos que instalar antes libmysqlclient-dev y python-dev.

patricio@plg:~/dev/python$ pip install -E env/ MySQL-python
Downloading/unpacking MySQL-python
  Running setup.py egg_info for package MySQL-python
    sh: mysql_config: not found
    Traceback (most recent call last):
    ....
sudo apt-get install libmysqlclient-dev
sudo apt-get install python-dev

ahora si,

patricio@plg:~/dev/python$ pip install -E env/ MySQL-python
Downloading/unpacking MySQL-python
   ...
Successfully installed MySQL-python
Cleaning up...

Probando cosas

Ya que estamos, probamos un proyecto que teníamos con una versión menor de django donde nos muestra algunos warnings.

patricio@plg:~/dev/python$ source env/bin/activate
(env)patricio@plg:~/dev/python$ cd django/nutricion/
(env)patricio@plg:~/dev/python/django/nutricion$ python manage.py runserver
Validating models...

/home/patricio/dev/python/env/lib/python2.6/site-packages/django/db/__init__.py:19:
DeprecationWarning: settings.DATABASE_* is deprecated; use settings.DATABASES instead.
  DeprecationWarning
/home/patricio/dev/python/env/lib/python2.6/site-packages/django/db/__init__.py:60:
DeprecationWarning: Short names for ENGINE in database configurations are deprecated.
 Prepend default.ENGINE with 'django.db.backends.'
  DeprecationWarning
0 errors found
Django version 1.3, using settings 'nutricion.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Clonando entornos

Cuando trabajamos con virtualenv es facil reproducir el entrono. Con el comando freeze podemos ver el estado actual de paquetes en el entorno.

(env)patricio@plg:~/dev/python$ pip freeze
Django==1.3
MySQL-python==1.2.3
distribute==0.6.15
wsgiref==0.1.2

Para reproducir el entorno, exportamos la lista de paquetes instalados y después lo replicamos en otro lado.

(env)patricio@plg:~/dev/python$ pip freeze > instalacion.txt
patricio@plg:~/dev/python$ virtualenv --distribute --no-site-packages otroEnv/
patricio@plg:~/dev/python$ pip install -E otroEnv/ -r instalacion.txt

Referencias:

http://pypi.python.org/pypi/virtualenv

http://www.saltycrane.com/blog/2009/05/notes-using-pip-and-virtualenv-django/

Buscar temas relacionados

Búsqueda personalizada

1 Comment

[...] rotundo éxito de cómo usar django con apache y mod_wsgi y demostradas las virtudes de utilizar virtualenv, veamos como usar todo esto [...]

Leave a comment

Your comment