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