en Programación, Python

Manejar entornos virtuales en Python

Manejar entornos virtuales en Python

Hola, como podrás haber notado, ya he pasado un tiempo sin escribir en el sitio, varias cosas han sucedido en mi vida personal y eso me ha hecho enfocarme en otras cuestiones, pero como le tengo mucho cariño al sitio, se me ocurrió realizar esta entrada sobre un tema relativamente sencillo, pero bastante útil para aquellos desarrolladores Python novatos (y no tanto) que desean aumentar su productividad, y seguir las buenas prácticas de la industria. Por lo tanto veremos como manejar entornos virtuales en Python.

El problema de no manejar entornos virtuales en python

Como sabrás, Python cuenta con una sencilla administración de paquetes con la herramienta pip, y si no tenemos cuidado y organización a la hora de utilizarla, podemos caer en ciertas situaciones que no son de mucho agrado para nosotros como desarrolladores.

Por ejemplo, suponiendo que tenemos un proyecto (proyecto_1) que tiene como dependencia un módulo en su versión 1.9.12, pero otro proyecto (proyecto_2) que necesitamos para nuestro día a día, tiene la dependencia a ese mismo módulo en su versión 2.0.11, como es un cambio de versión mayor hay muchas incompatibilidades que nuestro proyecto_1 no puede manejar.

Esto nos pone en una situación donde nos debemos preguntar ¿qué versión del paquete instalo? ¿cómo utilizar una versión específica de ese módulo para un determinado proyecto? Estas eran unas de las tantas interrogantes que se hacían los administradores y desarrolladores hace un par de años, cuando se trataba de mantener aplicaciones Python, o cuando necesitaban probar si, la nueva versión de un determinado módulo era compatible con la aplicación en desarrollo.

Para darle solución a las preguntas anteriores y las situaciones que las originan, fue que se encontró la forma de trabajar con entornos virtuales. Pero…

¿A qué me refiero con un entorno virtual en Python?

No son más que un conjunto de herramientas que permiten crear entornos aislados, donde cada uno de ellos es responsable de sus propios paquetes. Es decir, nos permiten crear una sandbox en la que instalar diferentes módulos que serán independientes, tanto de los que existen globalmente en el sistema (dentro del directorio site-packages), como de otros entornos virtuales. Bastante interesante cierto, y espera a ver lo simple que es su manejo.

Creando nuestro primer entorno virtual en Python

Ficha técnica para esta entrada:

  • OS: Linux dev 4.15.9-1-ARCH x86_64 GNU/Linux.
  • Distribución: Arch Linux
  • Versión de Python: Python 3.6.4 (Compatible con Python 3.x y Python 2.x)
  • Intérprete de comandos: Zsh

Para llevar a cabo esta tarea, utilizaremos a virtualenv y virtualenvwrapper de los que hablaremos un poco más a continuación:

  • Virtualenv: básicamente es el motor de todo esto, es el módulo que nos permite realizar la gestión de entornos virtuales para python en nuestro sistema (creación, administración, elminación, etc), se encuentra disponible a tráves de PyPi, pero aunque cumple su objetivo, eran necesarios demasiados pasos en un proceso cansado para lograr tener nuestros entornos funcionando.
  • Virtualenvwrapper: con el objetivo de facilitar el manejo de entornos virtuales con Python, se desarrolló este paquete, que como su nombre indica, contiene una serie de herramientas que actúan como wrapper sobre virtualenv, y facilitan su utilización.

Entre las funcionalidades que incluye virtualenvwrapper, encontramos la de crear diferentes entornos virtuales bajo el mismo directorio del sistema de ficheros, activar un entorno a través de un nombre dado, permitir fácilmente desactivar un entorno virtual para activar y trabajar con otro diferente, borrar un entorno y copiar completamente un entorno con un nombre distinto.

¿Sigues sin estar convencido de su uso?

La instalación de virtualenvwrapper es muy sencilla, basta con ejecutar el comando:

pip install virtualenvwrapper

Esto instalará además las dependencias necesarias (incluyendo a virtualenv)

Antes de comenzar a utilizar virtualenvwrapper, es conveniente modificar nuestro archivo de configuración de nuestro intérprete de comandos (.bashrc, .profile, .zshrc o similar) para añadir un par de líneas que nos faciliten la gestión de nuestros entornos.

La primer línea indicará cuál será el directorio a partir del que se crearán los diferentes entornos si se desea utilizar un directorio diferente al establecido por default, el cuál está establecido en $HOME/.virtualenvs. La segunda línea se encargará de invocar automáticamente al shell script virtualenvwrapper.sh, cada vez que abramos una terminal, sin esto no podríamos utilizar las opciones para manejar nuestros entornos.


export WORKON_HOME=$HOME/.pythonenvs

source /usr/bin/virtualenvwrapper.sh

Ahora procedamos a crear nuestro primer entorno virtual con el siguiente comando:

mkvirtualenv nombredelentorno --no-site-packages

A detalle, basta con invocar al comando mkvirtualenv seguido del nombre que indiquemos que tenga nuestro entorno, además añadimos el parámetro –no-site-packages para asegurar que el entorno se encuentre aislado del directorio site-packages de nuestro sistema.

Por defecto, el comando anterior se encargará de crear nuestro entorno y además activarlo para comenzar a trabajar, esto podrás notarlo en tu intérprete de comandos, ya que posiblemente verás el nombre de tu nuevo entorno en el prompt, en mi caso se aprecia así, siendo (entornoprueba) el entorno virtual que acabo de crear:

(entornoprueba) ..[themushr00m@dev] - [~] - [lun mar 19, 05:54]

Con el comando lsvirtualenv podremos obtener la lista de los entornos virtuales que tenemos creados, y si queremos cambiar de un entorno a otro, podemos hacerlo con el comando workon seguido del nombre del entorno que queremos utilizar.

Este comando se encargará de desactivar el entorno activado actualmente, como de activar el nuevo. Si ningún entorno se encuentra activado, únicamente activará el entorno indicado.

Si lo que queremos es dejar de trabajar en un entorno virtual, podemos desactivarlo con el comando deactivate.

Este es un consejo, si desean que el parámetro –no-site-packages sea aplicado a todos los entornos virtuales que vayan creando, sin tener que estar escribiéndolo siempre, pueden hacer lo siguiente:

En su archivo .bashrc, .profile, .zshrc o similar, justo debajo de las dos líneas que añadimos anteriormente (esto para que tengamos orden) añadimos la siguiente línea:

export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'

Y bien, con esto ya pueden comenzar a trabajar con entorno virtuales en Python, añadiendo paquetes a ellos sin ningún riesgo de afectar las versiones instaladas globalmente en el sistema (siempre deben asegurarse que su entorno virtual se encuentra activado :D)

Otra opción interesante es la de enlazar un entorno virtual determinado a un directorio de trabajo, esto nos permitirá que al activar dicho entorno, nos posicionemos en el directorio de trabajo inmediatamente, ¿genial cierto?

Esto lo realizamos de forma sencilla, únicamente es necesario que tengamos activo el entorno virtual que deseamos y nos posicionemos en el directorio que deseamos y ejecutamos el siguiente comando:

setvirtualenvproject

De esta forma, cada vez que abramos nuestro intérprete de comandos, y activemos el entorno virtual, nos posicionará inmediatamente en el directorio de trabajo del proyecto que definimos.

Si son unos talibanes de la documentación no olviden visitar el sitio de documentación de virtualenvwrapper para ver la referencia completa de comandos y parámetros.

Para cerrar con este tema de manejar entornos virtuales con Python, debo decir que pueden crear entornos virtuales con diferente versión de Python sin importar cual sea la principal de sus sistema, pero esto se los dejaré de tarea para que mediante la curiosidad puedan adentrarse a esta fabulosa herramienta.

Espero la explicación haya sido clara y cualquier comentario no dudes en dejarlo aquí abajo, o con confianza mencionalo por Twitter o en la Fanpage de Facebook, y aprovecho a invitarte para que me sigas en las redes y compartas el contenido del blog, con lo cual me harías un gran favor.

Saludos y nos vemos la próxima.

Deja un comentario