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