venv (entornos virtuales) en python


El proyecto de este post lo puedes descargar pulsando AQUI.

Los entornos virtuales en python (venv) son una forma que tenemos de poder aislar diferentes proyectos entre sí. Cuando nosotros trabajamos con python, muchas veces lo que hacemos es, cada vez que nos falta una dependencia:

sudo pip install DEPENDENCIA; por ejemplo

sudo pip install sympy

De esta manera, tenemos la librería disponible de forma global, con lo que eso supone. Si tenemos dos proyectos que usan esa librería, y uno de ellos necesita de una nueva característica de la nueva versión, si lo tenemos de forma global, lo actualizamos globalmente, con el consiguiente riesgo que ello supone para la otra aplicación. Una buena práctica es controlar las versiones del software que se tiene instalado, y antes de actualizar versiones (sobre todo si es una actualización grande de versión) hacer todas las pruebas pertinentes. Con los entornos virtuales lo que podemos es tener el entorno de la aplicación a con la versión x de esa librería y una aplicación b con una versión z de esa librería. Normalmente globales solo queremos tener, setuptools, pip y los propios entornos virtuales.

Nota sobre entornos virtuales entre Python común y Anaconda: en el artículo Entornos virtuales de Python: común y Anaconda

Controlando versiones

Una buena práctica es para cada proyecto tener un requirements.txt, de esta manera cuando alguien se baja un proyecto, puede crearse un entorno, instalar todas las dependencias con las que el proyecto está funcionando, y ponerse a trabajar.

Un fichero requirements.txt es algo tan sencillo como

libreria==version

Por ejemplo

sympy==1.0

Usando entornos virtuales

Para instalarlo hacemos

sudo pip install virtualenv

Una vez que lo tenemos instalado podemos creamos uno con:

virtualenv nombre_entorno

por ejemplo:

virtualenv env3       
Using base prefix '/usr'
New python executable in /home/dio/envexample/env3/bin/python3.5
Also creating executable in /home/dio/envexample/env3/bin/python
Installing setuptools, pip, wheel...done.

Con esto, se nos han creado una serie de directorios y ficheros

ls -la
total 32
drwxr-xr-x 5 dio dio 4096 jun 18 17:08 .
drwxr-xr-x 3 dio dio 4096 jun 18 17:08 ..
drwxr-xr-x 2 dio dio 4096 jun 18 17:08 bin
drwxr-xr-x 2 dio dio 4096 jun 18 17:08 include
drwxr-xr-x 3 dio dio 4096 jun 18 17:08 lib
-rw-r--r-- 1 dio dio   60 jun 18 17:08 pip-selfcheck.json

El directorio bin contiene scripts para interactuar con el entorno virtual y una copia del intérprete de python y pip entre otras librerías. El directorio include contiene librerías de apoyo en caso de ser necesarias. El directorio lib es donde están todas las librerías de python que tenemos instaladas en ese entorno virtual.

De este modo, lo que hemos conseguido es crearnos un entorno virtual, pero no lo estamos usando todavía, tenemos que activarlo primero. Para ello, hacemos (dentro del directorio del entorno virtual):

cd env3
source bin/activate
(env3) ➜  env3 

El prompt de la terminal cambia para decirnos que estamos usando el entorno virtual. Ahora, todo lo que usemos esta dentro de nuestro entorno virtual. Si listamos los paquetes que tenemos instalados

pip list --format=columns         
Package    Version
---------- -------
pip        9.0.1  
setuptools 36.0.1 
wheel      0.29.0 

Vemos que tenemos una instalación “básica“ de python en la que no tenemos paquetes.

Cuando ya no necesitemos el entorno virtual, o necesitemos trabajar com otro, tenemos que desactivarlo, si no se va a quedar activo toda la sesión con nosotros. Para ello hacemos:

deactivate

Y vemos como el prompt vuelve a la normalidad.

Con el entorno activado, si necesitamos instalar una librería (por ejemplo pytest), hacemos lo mismo que haríamos para instalarla de forma global, pero no necesitamos ser superusuarios:

(env3) ➜  env3 pip install pytest
Collecting pytest
  Using cached pytest-3.1.2-py2.py3-none-any.whl
Requirement already satisfied: setuptools in ./lib/python3.5/site-packages (from pytest)
Collecting py>=1.4.33 (from pytest)
  Using cached py-1.4.34-py2.py3-none-any.whl
Installing collected packages: py, pytest
Successfully installed py-1.4.34 pytest-3.1.2
(env3) ➜  env3 

Si nos bajamos el proyecto de este tutorial, e intentamos ejecutar el main.py, nos va a dar error ya que no tenemos la dependencia necesaria. Como hemos comentado, si todas las dependencias de nuestro proyecto las tenemos en el fichero requirements.txt, es tan sencillo como hacer pip install -r requirements.txt para que nuestro proyecto tenga todas las dependencias.

(env3) ➜  python_venv_example git:(master) ✗ pip install -r requirements.txt 
Collecting sympy==1.0 (from -r requirements.txt (line 1))
  Downloading sympy-1.0.tar.gz (4.3MB)
    100% |████████████████████████████████| 4.3MB 434kB/s 
Collecting mpmath>=0.19 (from sympy==1.0->-r requirements.txt (line 1))
  Downloading mpmath-0.19.tar.gz (498kB)
    100% |████████████████████████████████| 501kB 2.9MB/s 
Building wheels for collected packages: sympy, mpmath
  Running setup.py bdist_wheel for sympy ... done
  Stored in directory: /home/dio/.cache/pip/wheels/05/93/22/2d0f59d842347b1f38df0d3f7a3870586df60568d2a49d94c5
  Running setup.py bdist_wheel for mpmath ... done
  Stored in directory: /home/dio/.cache/pip/wheels/02/2b/99/cd867d5da48d951118a8020e86c0c12a65022702426582d4b8
Successfully built sympy mpmath
Installing collected packages: mpmath, sympy
Successfully installed mpmath-0.19 sympy-1.0
(env3) ➜  python_venv_example git:(master) ✗ 

Si revisamos las dependencias vemos que se han instalado las que teníamos en el fichero requirements.txt

pip list --format=columns      
Package    Version
---------- -------
mpmath     0.19   
pip        9.0.1  
py         1.4.34 
pytest     3.1.2  
setuptools 36.0.1 
sympy      1.0    
wheel      0.29.0 

Referencias

Comparte esta entrada en:
Safe Creative #1401310112503
venv (entornos virtuales) en python por "www.jarroba.com" esta bajo una licencia Creative Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies

ACEPTAR
Aviso de cookies