SecNot

feb 02, 2014

Django con virtualenv

Virtualenv es una herramienta para crear entornos virtuales para python.

Cuando mas de una aplicación python esta instalada en un mismo sistema, se puede dar el caso de que requieran versiones incompatibles de una biblioteca, que no sea posible instalarla en el directorio site-packages, o que no quieras actualizar las bibliotecas de la aplicación cuando se actualizen las del sistema.

Virtualenv soluciona todos estos problemas, permitiendo crear entornos virtuales en los que se pueden instalar bibliotecas y programas, de forma independiente del sistema, y otros entornos. Esto es especialmente útil durante el desarrollo y despliegue de aplicaciones.

Virtualenv

Instalación

Para instalar virtualenv, lo mejor es usar el gestor de paquetes de tu distribución, para hacer la herramienta disponible a todos los usuarios:

secnot@secnot:~$ sudo apt-get install python-virtualenv

Crear un entorno

Una vez instalado, vamos a crear un directorio donde almacenar todos nuetros entornos, por ejemplo:

secnot@secnot:~$ mkdir virtualenvs

Ahora creamos un nuevo entorno dentro del directorio, como no queremos que use ninguna libreria del sistema añadimos el parametro --no-site-packages

secnot@secnot:~$ virtualenv --no-site-packages virtualenvs/proyecto1_env

Instalar django en el entorno

Antes de instalar un nuevo paquete, tenemos que activar el entorno, para que cambie los directorios de busquesda a los del entorno:

secnot@secnot:~$ source virtualenvs/proyecto1_env/bin/activate

Ahora ya podemos instalar django y los paquetes que necesitemos para nuestra aplicación:

(proyecto1_env)secnot@secnot:~$ pip install django
(proyecto1_env)secnot@secnot:~$ pip install django-countries
(proyecto1_env)secnot@secnot:~$ django-admin.py startproject proyecto1

Para instalar un paquete no es necesario ser root, todos los paquetes se almacenan en los directorios creados dentro de nuestro directorio. Si te fijas verás que el prompt ha cambiado, indicando el entorno que está activo.

Una vez no necesitemos el entorno podemos salir ejecutando:

(proyecto1_env)secnot@secnot:~$ deactivate

Requirements

Una funcionalidad muy útil es la generación de una lista con todos los paquetes instalados en un entorno, esta normalmente se almacenan en un archivo llamado requirements.txt. Este archivo puede usarse después para duplicar los paquetes instalados al crear un nuevo entorno. Para generarla:

secnot@secnot:~$  source environments/env1/bin/activate
(env1)secnot@secnot:~$ pip freeze
Django==1.6
gunicorn==18.0
wsgiref==0.1.2
(env1)secnot@secnot:~$ pip freeze > requirements.txt

Si queremos instalar todos los paquetes de la lista en un entorno:

(env3)secnot@secnot:~$ pip install -r requirements.txt

Virtualenvwrapper

Virtualenvwrapper es un conjunto de scripts que automatizan la creación, borrado, y gestión de entornos. Se puede trabajar directamente con virtualenv sin ningún problema, pero virtualenvwrapper hace que todo el proceso sea un poco más sencillo y cómodo.

Instalación y configuración

Instalamos virtualenvwrapper con el gestor de paquetes:

secnot@secnot:~$ sudo apt-get install virtualenvwrapper

Por defecto los entornos se almacenan en el directorio .virtualenvs y no necesita mas configuración simplemente sal y vuelve ha hacer login en la cuenta para que se configuren las variables de entorno.

Si por qualquier razón en tu sistema no ha funcionado, puedes configurarlo manualmente y añadirlo en el script de inicio .bashrc:

secnot@secnot:~$ mkdir .virtualenvs
# /home/secnot/.bashrc
# Configuración de VIRTUALENVWRAPPER
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# Ubuntu 14.04: source /etc/bash_completion.d/virtualenvwrapper

Uso

Estos son los comandos de virtualenvwrapper más usados, para mas detalles es recomendable leer la documentación:

  • mkvirtualenv: Crea un nuevo entorno, con la particularidad de que se convierte en el entorno activo.
  • cpvirtualenv: Duplica un entorno.
  • rmvirtualenv: Elimina un entorno, el entorno a elminar debes estar inactivo antes de eliminarlo.
  • allvirtualenv: Ejecuta un comando en todos los entornos.
  • workon: Selecciona el entorno activo, si no hay argumentos lista los entornos disponibles.
  • deactivate: Desactiva el entorno indicado.

El mejor método para entender como funciona es un ejemplo, así el vamos a crear dos entornos, despues instalar django en el primero de ellos, y por último eliminar el segundo entorno:

secnot@secnot:~$ mkvirtualenv --no-site-packages env1
New python executable in env1/bin/python
Installing setuotools, pip...done.
(env1)secnot@secnot:~$ mkvirtualenv --no-site-packages env2
New python executable in env2/bin/python
Installing setuotools, pip...done.
(env2)secnot@secnot:~$ workon env1
(env1)secnot@secnot:~$ pip install django
(env1)secnot@secnot:~$ workon
env1
env2
(env1)secnot@secnot:~$ deactivate
secnot@secnot:~$ rmvirtualenv env2
Removing env2...
secnot@secnot:~$ ...

Si quieres usar una versión de Python distinta a la por defecto del sistema, puedes especificarla en el momento de creación del entorno.

secnot@secnot:~$ mkvirtualenv -p /usr/bin/python3 --no-site-packages env1