Si estás familiarizad@ con Python o estás iniciándote, es posible que en algún tutorial hayas visto que hagan uso de virtualenv
. Virtualenv es una herramienta que nos permite tener entornos Python totalmente separados y aislados, de manera que el intérprete y las librerías de proyectos diferentes no entren en conflicto.
¿Por qué es una buena práctica usar virtualenv?
Cuando estás desarrollando varios proyectos Python en un mismo ordenador, es posible que tengas más de un intérprete de Python instalado, por ejemplo, Python 2.7 y Python 3.6. Además, puede que en dos proyectos distintos hagas uso de una misma librería pero uses una versión diferente en cada uno de ellos.
¿Cómo haces para que dichas librerías no entren en conflicto? Imaginemos que tenemos dos proyectos llamados A
y B
y que ambos hacen uso de una misma librería lib_x
. El proyecto A
enlaza con la versión 1.0.0
de la librería lib_x
y el proyecto B
, por una serie de requisitos, utiliza nuevas funcionalidades de la librería lib_x
que están recogidas en la versión 2.0.0
.
Inicialmente no es posible mantener ambas versiones de la misma librería instaladas en el sistema, o se usa la versión 1.0.0
o la 2.0.0
. Es aquí donde entra en juego virtualenv
. Con virtualenv podemos tener entornos Python de configuración y ejecución independientes, de manera que la configuración y librerías de uno no entren en conflicto con los de otro.
Un entorno virtual está compuesto por un intérprete de Python, una configuración específica y librerías independientes.
Instalación de virtualenv
Para instalar virtualenv nos ayudaremos de otra herramienta que viene instalada junto con el intérprete de Python: pip
. Pip es una utilidad de línea de comandos que nos permite instalar y administrar librerías y paquetes Python. Muchos de estos paquetes y librerías se encuentran alojados en el Python Package Index o PyPI, el repositorio oficial de Python para paquetes de terceros.
El comando para instalar virtualenv con pip es el siguiente:
$> pip install virtualenv
Una vez que tenemos instalado virtualenv en nuestro sistema, ya podremos crear todos los entornos virtuales que queramos.
Creando un entorno virtual con virtualenv
Para crear un entorno virtual con virtualenv nos situaremos en el directorio raíz de nuestro proyecto y ejecutaremos el siguiente comando:
$> virtualenv env
Esto creará el directorio env
, el cuál contiene el entorno virtual:
/tutorial-virtualenv |__/env |__/bin |__/include |__/lib
El directorio bin
(se llama Scripts
en Windows) contiene los ejecutables: como el intérprete de Python o pip. Por su parte, los directorios include
y lib
contienen las librerías necesarias para correr nuestro código. Las librerías de terceros se instalarán en env/lib/pythonX.X/site-packages/
.
En mi caso, yo tengo dos versiones de Python instaladas: Python 2.7 (venía instalada con el sistema) y Python 3.6.
Python 2.7 es la versión por defecto y está instalada en /usr/bin
, mientras que Python 3.6 lo está en /usr/local/bin
. ¿Cómo indico a virtualenv qué versión de Python usar? Si no indicamos nada, virtualenv tendrá en cuenta la versión por defecto de Python. En el ejemplo, la versión de Python del entorno virtual es la 2.7. Si queremos usar la versión 3.6, debemos indicarle la ruta en la que se encuentra el intérprete de Python a utilizar, por ejemplo:
$> virtualenv -p /usr/local/bin/python3.6 env
Usar el entorno virtual
En el paso anterior creamos nuestro entorno virtual, sin embargo, si instalamos cualquier paquete no lo haremos en dicho entorno. Para ello, primero debemos activarlo ejecutando el siguiente comando:
$> source env/bin/activate
En el caso de Windows ejecutaremos:
$> env\Scripts\activate.bat
Sabremos que estamos dentro del entorno virtual porque el prompt del terminal comienza con (env):
Cualquier librería que instalemos ahora será dentro del entorno virtual.
Para salir del entorno virtual, lo haremos ejecutando el siguiente comando:
$> deactivate
requirements.txt
Por regla general, los proyectos Python suelen distribuirse con un fichero llamado requirements.txt
. Este fichero contiene un listado con todas las librerías de las que depende el proyecto, junto con sus números de versión.
Los pasos para migrar un proyecto de una máquina a otra o desde un repositorio de código suelen ser:
- Crear el entorno virtual con virtualenv
- Activar el entorno
- Instalar las dependencias indicadas en el fichero
requirements.txt
Para instalar las librerías listadas en el fichero requirements.txt
, basta con ejecutar el siguiente comando:
$> pip install -r requirements.txt
Consideraciones a tener en cuenta
Cuando se trabaja con virtualenv
, debes tener en cuenta las siguientes cosas:
- El entorno virtual hace uso de rutas absolutas. Si copias y pegas para duplicar, te llevas el entorno a otra máquina o cambias el nombre de algún directorio que esté incluido en la ruta de tu proyecto, no funcionará.
- Es una buena práctica añadir tus propias variables de entorno al final del fichero
activate
. - Tu entorno virtual puede estar ubicado en cualquier parte del sistema de ficheros. Yo suelo tenerlo dentro de la carpeta del proyecto, junto con el código.
- En el ejemplo, el entorno virtual lo he llamado
env
pero puedes darle el nombre que tú quieras. Por convención se suelen usarenv
ovenv
.
Ejemplo de configuración de un proyecto con virtualenv
y requirements.txt
:
/mi_proyecto |_/env |_program.py |_requirements.txt |_...py
Guía rápida (cheat sheet) de virtualenv y pip
🎯 Instalar virtualenv:
$> pip install virtualenv
🎯 Crear entorno virtual:
$> virtualenv env
🎯 Crear entorno virtual especificando el intérprete:
$> virtualenv -p ruta/interprete/python env
🎯 Crear entorno virtual heredando las librerías del sistema (no recomendado):
$> virtualenv --system-site-packages env
🎯 Activar el entorno virtual en Linux/Mac:
$> source env/bin/activate
🎯 Activar el entorno virtual en Windows:
$> env\Scripts\activate.bat
🎯 Salir del entorno virtual:
$> deactivate
🎯 Instalar un paquete/librería (por ejemplo, flask):
$> pip install flask
🎯 Instalar una versión concreta de un paquete/librería:
$> pip install flask==1.0.1
🎯 Actualizar la versión de un paquete/librería:
$> pip install flask -U
🎯 Desinstalar una librería:
$> pip uninstall flask
🎯 Listar todas las librerías:
$> pip list
🎯 Listar todos los paquetes/librerías en formato requirements.txt
:
$> pip freeze
🎯 Crear/Actualizar el fichero requirements.txt
:
$> pip freeze > requirements.txt
🎯 Mostrar la información de un paquete/librería:
$> pip show flask
Conclusión
Bueno amig@ Pythonista 🐍 En el tutorial hemos visto cómo gestionar distintos entornos virtuales Python con virtualenv
. También hemos repasado cómo gestionar las dependencias, paquetes y librerías de un proyecto haciendo uso de la herramienta pip
. Si tienes cualquier duda al respecto, puedes dejarme un comentario o ponerte en contacto conmigo.
Imagen de la cabecera: Vector de abstracto creado por freepik – www.freepik.es