Virtualenv y Pip para crear Entornos Virtuales de Python
Tags: python, virtualenv, pip
Published: 2020-06-01 13:51:34

[*Virtualenv*](https://virtualenv.pypa.io/en/latest/index.html) es una herramienta para crear entornos de [Python](https://www.python.org/) aislados, es decir ambientes completamente separados de la instalación global de Python, con sus propias dependencias y versiones.

Cuando comencé a programar aplicaciones web, [Django](https://www.djangoproject.com/) era uno de los [frameworks MVC](https://es.wikipedia.org/wiki/Modelo%E2%80%93vista%E2%80%93controlador) de moda. Aún no existía React, el ecosistema Javascript se reducía a jQuery, Node.js era una novedad y Rails era la joyita. Era tanto el hype con Django que venia creciendo muy rápido y con un ciclo de release muy corto, por lo que salían versiones muy seguido con bugfixes, nuevas features y algunos breaking changes.

En mi primera aplicación había usado Django 1.4 pero al comenzar a programar la segunda aplicacion el framework ya se encontraba en la version 1.8, y al actualizar esta dependencia desate el caos. Aquella primera aplicación web se empezó a romper por todos lados. Era obvio, los breaking changes entre Django 1.4 y 1.8 hacían que nada funcionase como debía.

Buscando una solución fue que encontré *Virtualenv*. Con esta herramienta pude crear dos entornos virtuales completamente aislados donde instalar las dependencias de cada proyecto sin que interfieran entre si. Esto me permitía correr las dos aplicaciones en paralelo sin inconvenientes, y me daba la seguridad de que podía instalar y actualizar cualquier dependencia sin miedo a romper otra cosa mas que la misma aplicación en la que me encontraba trabajando.

Virtualenv ya se ha vuelto un estándar para la comunidad, tal es así que desde Python 3.3 se agrego al core el modulo [venv](https://docs.python.org/3/library/venv.html), que nos permite crear entornos virtuales de forma nativa. Aunque aún no posee todas las virtudes de Virtualenv se sabe que es un modulo en continuo desarrollo. Peeeeero... por el momento *Virtualenv* sigue siendo la mejor opción.

<br>

# ¿Cómo instalo Virtualenv?

*Virtualenv* se instala, al igual que la mayoría de las dependencias de Python, con *pip*. Solo necesitamos correr este comando:

```bash
$ pip install virtualenv
```

<br><br>



# ¿Cómo se usa Virtualenv?

*Virtualenv* es muy sencillo de usar y no requiere configuración. Generalmente solo necesitaremos de 3 comandos que nos permitirán crear, activar y desactivar los entornos virtuales.

Hay distintas maneras de organización, algunos programadores prefieren mantener todos sus entornos virtuales dentro de un mismo directorio, pero yo personalmente prefiero crearlos dentro del directorio de cada proyecto. De esta manera puedo asignarle siempre el mismo nombre, y me resulta mucho mas sencillo para trabajar.

Para *crear* un entorno virtual primero debemos ubicarnos en el directorio elegido y luego ingresar el siguiente comando: 

```bash
$ virtualenv env
```
<br>

Este comando nos creará dentro de la carpeta `env` un entorno virtual con el interprete de Python por defecto de nuestro sistema operativo.

**Y si necesitamos crear un entorno con otra versión de Python?**

Sencillo... usamos el flag `--python` e indicamos la ruta del interprete de Python que querramos:

```bash
$ virtualenv --python=/usr/local/bin/python3.8 env
```
<br>

El entorno virtual instalara *pip* y *wheel* por defecto, de manera que con solo activarlo ya podremos comenzar a instalar las dependencias que necesitamos.

Para *activar* el entorno virtual nos ubicamos en el directorio donde lo hemos creado y ejecutamos el siguiente comando:

```bash
# Mac y Linux
$ source env/bin/activate

# Windows
> env\Scripts\activate 
```
<br>

El prompt de nuestra consola ahora deberá mostrarnos el nombre del entorno virtual, lo cual nos da la seguridad de que se activo correctamente:

```bash
(env) $
```
<br>

Por último, una vez que hayamos terminado de trabajar, o si necesitamos cambiar de entorno, lo *desactivamos* con el siguiente comando:

```bash
(env) $ deactivate
```
<br>

Para *borrar* un entorno virtual basta simplemente con eliminar su carpeta.

Con estos comandos ya tenemos practicamente todo lo que necesitamos para usar *Virtualenv*, pero en la ayuda podemos consultar las demás opciones disponibles:

```bash
$ virtualenv --help
```
<br>

Por último, nunca te olvides de ir guardando las dependencias de tus proyectos con el comando `freeze` de *pip*, ya que este nos permitirá replicar nuestro entorno virtual en otro equipo de manera sencilla y rápida:

```bash
# Generar un archivo con las dependencias
$ pip freeze > requirements.txt

# Instalar las dependencias desde el archivo generado
$ pip install -r requirements.txt
```
<br><br>

# Conclusiones

Espero que esto te sirva si estas empezando a programar con Python, y recordá que la mejor manera de aprender es haciendo, y al hacer vamos a equivocarnos.

Tenemos que darle mucho amor a lo que aprendemos desde la necesidad, porque nos permite comprender el valor real que nos aporta para resolver nuestro problema, y puedo asegurarte que es un aprendizaje que vamos a incorporar para siempre.

Gracias por haber llegado hasta el final. Si este post te gustó dejame un comment o mandame un tweet ([@luciano_dev](https://twitter.com/luciano_dev)) porque me interesa conocer tu opinión.

¡Hasta el próximo post! ❤️