Oct072015

Virtualenv y Pip: El pico y la pala de los desarrolladores de Python

Quienes hayan tenido la experiencia de programar en Python sabrán que este lenguaje de programación de propósito general incluye por defecto una gran cantidad de funciones para toda clase de tareas sobre todo en lo relativo al tratamiento de listas, tuplas o diccionarios.
También sabrán que cualquier proyecto, por pequeño que sea, suele tener unas cuantas dependencias en forma de módulos de Python que podemos encontrar a través de los repositorios de nuestras distribuciones favoritas. No obstante, es una lata tener que enguarrinar nuestro sistema con montón de paquetes que a lo mejor solo necesitaremos de forma puntual y que posiblemente nos olvidemos de desinstalarlos una vez hayamos terminado con cada proyecto.

Entorno virtual

Para evitar esto, tenemos una herramienta muy interesante llamada virtualenv que podremos encontrar en nuestros repos y que, a efectos prácticos, nos permite crear una jaula que contendrá una estructura aislada del sistema con las librerías y herramientas necesarias para poder gestionar cualquier proyecto escrito en Python.

¿Cómo se hace?

Crear un virtualenv es muy sencillo, pues solo es necesario ejecutar el siguiente comando:

$ virtualenv <nombre_de_la_jaula>

Al crear el entorno virtual, virtualenv copiará las librerías y otros ficheros (incluyendo el ejecutable de Python) que tenga el sistema por defecto. Esto puede suponer un problema si, como es mi caso, vuestro sistema tiene establecido por defecto una versión 3.x de Python y vuestro proyecto está escrito para versiones 2.X; Todo eso pese a tener instaladas ambas versiones en el sistema.

Para que el virtualenv copie la versión adecuada a vuestros propósitos es tan sencillo como añadir un parámetro al comando anterior.

$ virtualenv -p /usr/bin/pythonX <nombre_de_la_jaula>

donde X sería 2 o 3 dependiendo de la versión que queráis usar en la jaula.

Una vez creado el entorno tan solo nos queda activarlo y para eso tendremos que ejectuar el script activate en nombre_de_la_jaula/bin/

$ source nombre_de_la_jaula_/bin/activate

o

$ . nombre_de_la_jaula_/bin/activate

Para desactivar el entorno tan solo ese necesario llamar al comando deactivate.

$ deactivate

Gestión de dependencias

Habiendo activado el entorno, solo queda instalar las dependencias. Aquí intervendrá una de las herramientas que se instalan por defecto al crear el entorno, PIP.

Instalar

$ pip install <nombre_del_modulo> (p.ej: pip install django)

Desinstalar

$ pip uninstall <nombre_del_modulo> (p.ej: pip uninstall django)


Hacerlo todo de una vez

Os puede pasar que trabajando en un proyecto tengáis que volver a crear el entorno virtual e instalar las dependencias por las razones que sean.
Una manera de no repetir el esfuerzo es utilizando una maravillosa opción de pip que nos permite crear una lista de todos los módulos de Python instalados en el entorno para luego poder instalarlos leyendo esa lista.

Guardar modulos instalados en una lista

$ pip freeze > dependencias.txt

Instalar desde la lista

$ pip install -r requirements.txt

Conclusiones

  • Virtualenv combinado con pip nos permite crear entornos virtuales donde poder tener distintas versiones de módulos para distintos proyectos sin mezclarse entre ellos.
  • Al no instalarse en el sistema, una vez terminemos con el proyecto, podremos borrar el entorno, liberando el espacio de disco.
  • Tenemos la posibilidad de crear una lista con las dependencias de un proyecto para poder replicar el entorno si fuera necesario.
  • Por otro lado, se echa en falta poder instalar en dicho entorno otras librerías que no sean Python con la misma facilidad que cuando usamos pip.

Saludos y a disfrutar.

P.D: No hay nada como apurar artículos antes del cumple del blog

Política de comentarios

Dada la importancia de los comentarios como espacio de participación, te pedimos por favor que leas detenidamente y cumplas con las siguientes normas de participación.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *