El desarrollo de un proyecto en python involucra la creación de un entorno virtual con el que se pueden mantener las versiones de las librerías, frameworks, etc. y aislar el entorno de las dependencias de proyectos diferentes. Crear el entorno virtual en uno de lo pasos esenciales para iniciar o continuar con proyecto en Python en un entorno de desarrollo o de producción.
Para poder gestionar la instalación de los paquetes y del ambiente virtual para Python es necesario instalar pip o easy_install. No enfocaremos en pip y con éste podremos instalar el resto de los paquetes, librerías y dependencias de python.
Para instalar pip en Linux puede utilizar uno de los siguientes comandos:
Ubuntu / Debian
sudo apt install python3-pip
Centos/Redhat
sudo yum install epel-release
sudo yum install python-pip
Arch Linux / Manjaro
pacman -S python-pip
openSUSE / SUSE Linux Enterprise Server
zypper install python3-pip
Una vez instalado PIP (Package Installer for Python) podrás instalar los elementos necesarios para instalar y gestionar paquetes de Python. Usaremos esta herramienta para instalar el paquete virtualenv utilizando el siguiente comando:
sudo pip install virtualenv
Si utilizas una distro diferente a Ubuntu asegúrate de estar como usuario root o con privilegios de superusuario y remueve la palabra sudo.
Crear el ambiente virtual
Cuando creamos un ambiente virtual podemos instalar paquetes de python y cuando se llama algunos de esos paquete o librerías se ejecutan las versiones que se han instalado dentro del ambiente, es decir se puede tener múltiples ambientes con diferente versiones de la misma librería o paquete y al ejecutarlos se respetarán esas versiones, es decir que cada ambiente virtual es independiente de otro o del mismo sistema operativo.
Para crear un ambiente virtual solo es necesario ubicarse en el directorio donde queramos crear el ambiente virtual, digamos, en el directorio del proyecto a desarrollar o a trabajar. Si no existiera ese directorio es necesario crearlo. Por ejemplo crearemos el directorio ‘mi_proyecto’ y dentro de el crearemos el ambiente virtual de python con estos comandos:
cd ~
mkdir mi_proyecto
virtualenv env
Con esto crearemos el ambiente virtual identificado como ‘env’, tu lo puedes llamar como tu quieras, puede ser por ejemplo env_mi_proyecto o llamarlo como el mismo directorio. Una vez creado lo puedes activar llamando el comando source y la ruta nombre_del_ambiente/bin/activate para este ejemplo seria:
cd ~/mi_proyecto
source env/bin/activate
Si todo ha funcionado como debe ser verás el entorno virtual activado cuando en al inicio del promt aparezca en nombre del ambiente entre parentecis. Aquí te muestro una salida de ejemlo:
$ mkdir mi_proyecto $ cd mi_proyecto/ ~/mi_proyecto$ ~/mi_proyecto$ virtualenv env Using base prefix '/usr' New python executable in /home/vagrant/mi_proyecto/env/bin/python3 Also creating executable in /home/vagrant/mi_proyecto/env/bin/python Installing setuptools, pip, wheel… done. ~/mi_proyecto$ source env/bin/activate (env) ~/mi_proyecto$
Como puedes ver en la última linea del texto anterior al principio aparece ‘(env)’ esto nos indica que el ambiente virtual de python está activado.
Para desactivar el un ambiente virtual solo debes teclear el comando deactivate.
(env) ~/mi_proyecto$ deactivate
~/mi_proyecto$
Validar que el ambiente virtual de python esté funcionando podemos activarlo y verificar la ruta de donde se está ejecutando, por ejemplo, el mismo python esté dentro del ambiente virtual y no de la ruta global del sistema.
~/mi_proyecto$ which python3
/usr/bin/python3
~/mi_proyecto$ source env/bin/activate
(env) ~/mi_proyecto$ which python3
/home/vagrant/mi_proyecto/env/bin/python3
Este es un mero ejemplo en Ubuntu para probar Python3, pero se puede hacer la misma prueba con python2 o python dependiendo de la versión que manejes y la distribución Linux que estés usando.
virtualenvwraper
virtualenvwraper es un conjunto de extensiones para la herramienta virtualenv. Las extensiones incluyen utilerías (llamados wrapers o envolturas) para crear y eliminar entornos virtuales, administrar el flujo de trabajo al desarrollar y facilitar el trabajo si tienes más de un proyecto a la vez sin introducir conflictos en sus respectivas dependencias.
Para instalar virtualwraper podemos utilizar de nuevo PIP con el siguiente comando:
sudo pip install virtualenvwrapper
Usar virtualenv sin virtualenvwrapper es un poco laborioso porque cada vez que queremos activar un entorno virtual, tenemos que escribir un comando largo como este:
source ~/mi_proyecto/env/bin/activate
Pero si tenemos virtualenvwraper el comando que necesitamos puede ser mas sencillo y corto. Por ejemplo podríamos usar:
workon mi_proyecto
Pero esto aun no funciona, primero tenemos que ejecutar el script virtualenvwrapper.sh y realizar algunas configuraciones. Para hacerlo necesitamos crear una variable de entorno del shell llamada WORKON_HOME y para hacerlo puedes editar el archivo .bash_rc y agregar ‘ export WORKON_HOME=~/Envs’ sin las comillas o puedes ejecutar el siguiente comando:
echo 'export WORKON_HOME=~/Envs' >> ~/.bashrc
En este comando lo que indicamos es que el directorio para guardar los ambientes virtuales de python es ~/Envs, este directorio puede ser llamado como tu quieras, es solo un nombre para que sea fácil identificar que se almacena en este. Ahora vamos a crear el directorio
mkdir ~/Envs
Es necesario cargar de nuevo el entorno para que la variable esté presente y validar que apunte al directorio recién creado. Puedes cerrar y abrir la terminal, o cerrar la sesión ssh y volver a conectarte para que se cargue el entorno de nuevo, sino quieres hacer esto también puedes recargar el entorno con el comando
source ~/.bashrc
Y luego cambiar al directorio mediante la varialbe $WORKON_HOME
cd $WORKON_HOME
pwd
Si te muestra la ruta de tu directorio por ejemplo /home/vagrant/Envs todo está correcto, pero si recibes un mensaje de «el directorio no existe» o «No such file or directory» vuelve a revisar la configuración y asegúrate de corregir algo que no se configuró como se dice en los pasos anteriores.
El siguiente paso es ejecutar el script virtualenvwraper.sh
source /usr/local/bin/virtualenvwrapper.sh
También es necesario agregar este script al archivo .bashrc para que esté disponible cuando se requiera, así cada vez que abras la terminal o inicies una sesión de bash el virtualwenvwraper estará disponible.
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
Ahora es posible crear un ambiente virtual con el comando:
mkvirtualenv env2
Es importante hacer notar que ahora ya no es importante en que carpeta o directorio se esté al momento de crear el ambiente virtual ya que toda la información de los ambientes se guarda en el directorio ~/Envs o el que hayas configurado. Y puedes crear tantos ambientes virtuales como necesites.
Para activar un ambiente virtual crearo con el comando anterior solo es necesario teclear:
workon env2
Aquí una salida del como se crea el ambiente virtual env2 y se obtiene el identificador (env2) en el promt al momento de activarlo.
~$ mkvirtualenv env2
Using base prefix '/usr'
New python executable in /home/vagrant/Envs/env2/bin/python3
Also creating executable in /home/vagrant/Envs/env2/bin/python
Installing setuptools, pip, wheel…
done.
virtualenvwrapper.user_scripts creating /home/vagrant/Envs/env2/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/vagrant/Envs/env2/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/vagrant/Envs/env2/bin/preactivate
virtualenvwrapper.user_scripts creating /home/vagrant/Envs/env2/bin/postactivate
virtualenvwrapper.user_scripts creating /home/vagrant/Envs/env2/bin/get_env_details
(env2) ~$ workon env2
(env2) ~$
(env2) ~$ which python
/home/vagrant/Envs/env2/bin/python
(env2) ~$
Una opción que te puede facilitar la vida es que al activar el ambiente virtual te posicione en la ruta de tu proyecto de forma automática. Para hacer esto solo tienes que agregar al final del script activate el comando cd con la ruta adecuada. Por ejemplo si mi proyecto está en /home/vagrant/mi_proyecto este comando agregará esta instrucción al final del archivo
echo "cd /home/vagrant/mi_proyecto" >> /home/vagrant/Envs/env2/bin/activate
Y al activar el ambiente virtual te posicionará en el directorio indicado. Aquí un ejamplo de la salida.
~$ pwd /home/vagrant ~$ workon env2 (env2) ~/mi_proyecto$ pwd /home/vagrant/mi_proyecto (env2) ~/mi_proyecto$
Espero que con este post puedas crear, gestionar y trabajar de manera mas fácil con los ambiente virtuales de Python, a mi me tomó algún tiempo entenderlos y pode aprovechar todo el potencial que tienen cuando trabajas con varios proyectos o cuando implementas varias aplicaciones web en un mismo server y tienen dependencias diferentes.