Entornos virtuales en Python

Muchos de nosotros trabajamos en varios proyectos de Python al mismo tiempo. Muchos de estos proyectos pueden depender de diferentes versiones de la misma librería. Esto es un problema. Incluso si trabajas en un solo proyecto y lo implementas en producción, es posible que encuentres algún que otro problema, porque el sistema de Python en el servidor de producción puede variar debido a las posibles actualizaciones del sistema operativo o parches de seguridad, dando como resultado un error en la aplicación. En general, lo suyo es tener un control total sobre el entorno de Python en tus proyectos. Es por eso que en este artículo vamos a hablar sobre entornos virtuales

La idea básica de un entorno virtual es tener un intérprete de Python y sus site-packages separados del mismo sistema. Además, puedes tener varios. Lo que soluciona ambos problemas. Puedes asignar un entorno virtual independiente con sus propias dependencias para cada proyecto y olvidarte de los dichosos conflictos con otros proyectos y del sistema de Python.

En este tutorial, aprenderás los conceptos detrás de los entornos virtuales y cómo crearlos y utilizarlos, además de descubrir varias alternativas para situaciones especiales.

Virtualenv

El paquete virtualenv soporta este concepto. Puedes instalar virtualenv utilizando pip install virtualenv.

Una vez hayas instalado virtualenv, puedes empezar a crear entornos virtuales. Vamos a crear dos entornos virtuales llamados “venv_1” y “venv_2”

~ > virtualenv ~/venv_1
 
Using real prefix '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7'
 
New python executable in /Users/gigi/venv_1/bin/python2.7
 
Also creating executable in /Users/gigi/venv_1/bin/python
 
Installing setuptools, pip, wheel...done.
 
 
 
~ > virtualenv ~/venv_2
 
Using real prefix '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7'
 
New python executable in /Users/gigi/venv_2/bin/python2.7
 
Also creating executable in /Users/gigi/venv_2/bin/python
 
Installing setuptools, pip, wheel...done.

Vamos a ver qué ha pasado

~ > ls -la ~/venv_1
 
total 16
 
drwxr-xr-x    7 gigi  staff   238 Mar 29 23:12 .
 
drwxr-xr-x+ 254 gigi  staff  8636 Mar 29 23:12 ..
 
lrwxr-xr-x    1 gigi  staff    79 Mar 29 23:12 .Python -> /usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/Python
 
drwxr-xr-x   16 gigi  staff   544 Mar 29 23:12 bin
 
drwxr-xr-x    3 gigi  staff   102 Mar 29 23:12 include
 
drwxr-xr-x    3 gigi  staff   102 Mar 29 23:12 lib
 
-rw-r--r--    1 gigi  staff    60 Mar 29 23:12 pip-selfcheck.json

Dentro del subdirectorio “bin” encontrarás unos cuantos ejecutables y symlinks. Entre ellos se incluyen el intérprete de Python en sí, pip, easy_install, y lo más importante unos cuantos activate scripts.

~ > ls -la ~/venv_1/bin
 
total 136
 
drwxr-xr-x  16 gigi  staff    544 Mar 29 23:12 .
 
drwxr-xr-x   7 gigi  staff    238 Mar 29 23:12 ..
 
-rw-r--r--   1 gigi  staff   2077 Mar 29 23:12 activate
 
-rw-r--r--   1 gigi  staff   1019 Mar 29 23:12 activate.csh
 
-rw-r--r--   1 gigi  staff   2217 Mar 29 23:12 activate.fish
 
-rw-r--r--   1 gigi  staff   1137 Mar 29 23:12 activate_this.py
 
-rwxr-xr-x   1 gigi  staff    249 Mar 29 23:12 easy_install
 
-rwxr-xr-x   1 gigi  staff    249 Mar 29 23:12 easy_install-2.7
 
-rwxr-xr-x   1 gigi  staff    221 Mar 29 23:12 pip
 
-rwxr-xr-x   1 gigi  staff    221 Mar 29 23:12 pip2
 
-rwxr-xr-x   1 gigi  staff    221 Mar 29 23:12 pip2.7
 
lrwxr-xr-x   1 gigi  staff      9 Mar 29 23:12 python -> python2.7
 
-rwxr-xr-x   1 gigi  staff   2336 Mar 29 23:12 python-config
 
lrwxr-xr-x   1 gigi  staff      9 Mar 29 23:12 python2 -> python2.7
 
-rwxr-xr-x   1 gigi  staff  12744 Mar 29 23:12 python2.7
 
-rwxr-xr-x   1 gigi  staff    228 Mar 29 23:12 wheel

El activate script es la clave. Con el fin de activar un entorno virtual específico, la ruta del activate script está en: source ~/venv_1/bin_activate. El efecto es la creación de un grupo de variables de entorno y cambiar el prompt para el nombre del entorno virtual activado. También agrega una función de shell llamada deactivate() que restablecerá todo. Una vez que el entorno virtual esté activado, al escribir python ejecutará Python con sus dependencias.

~ > source ~/venv_1/bin/activate
 
(venv_1) ~ > which python
 
/Users/gigi/venv_1/bin/python
 
(venv_1) ~ >

Vamos a desactivarlo.

(venv_1) ~ > deactivate
 
~ > which python
 
/usr/local/bin/python

Si tienes múltiples intérpretes instalados en tus sistemas, puedes especificar cuál quieres usar en tu entorno virtual utilizando la opción -p. Aquí tienes un entorno virtual en Python 3.

~ > virtualenv ~/venv_3 -p /usr/local/bin/python3
 
Running virtualenv with interpreter /usr/local/bin/python3
 
Using base prefix '/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5'
 
New python executable in /Users/gigi/venv_3/bin/python3.5
 
Also creating executable in /Users/gigi/venv_3/bin/python
 
Installing setuptools, pip...done.
 
 
 
~ > source ~/venv_3/bin/activate
 
(venv_3)~ > python
 
Python 3.5.1 (default, Jan  9 2016, 19:28:52)
 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)] on darwin
 
Type "help", "copyright", "credits" or "license" for more information.
 
>>>

Virtualenv funciona incluso en pypy

~ > virtualenv ~/venv_pypy -p `which pypy`
 
Running virtualenv with interpreter /usr/local/bin/pypy
 
New pypy executable in /Users/gigi/venv_pypy/bin/pypy
 
Installing setuptools, pip...done.
 
~ > source ~/venv_pypy/bin/activate
 
(venv_pypy)~ > python
 
Python 2.7.10 (5f8302b8bf9f53056e40426f10c72151564e5b19, Feb 11 2016, 20:39:39)
 
[PyPy 4.0.1 with GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
 
Type "help", "copyright", "credits" or "license" for more information.
 
>>>>

Puedes cambiar de un entorno a otro sin tener que desactivarlos primero:

(venv_3)~ > source ~/venv_2/bin/activate
 
(venv_2) ~ > which python
 
/Users/gigi/venv_2/bin/python

Ok, vamos a ver cómo utilizar dos versiones diferentes del mismo paquete en dos entornos virtuales diferentes. Esto es tan simple como activar cada entorno e instalar la versión deseada. Los entornos son totalmente independientes, por lo que el hecho de que haya una versión diferente en los otros entornosno es ningún problema.

Vamos a instalar el paquete sh versión 1.0.0 en "venv_1".

(venv_1) ~ > pip install sh==1.0
 
Collecting sh==1.0.0
 
  Downloading sh-1.0.tar.gz
 
Building wheels for collected packages: sh
 
  Running setup.py bdist_wheel for sh ... done
 
  Stored in directory: /Users/gigi/Library/Caches/pip/wheels/f9/fb/a1/383f6dc2834b319a788a006d3ab7cc014ee852485f00b9e8c3
 
Successfully built sh
 
Installing collected packages: sh
 
Successfully installed sh-1.0
 
 
 
(venv_1) ~ > pip freeze | grep sh
 
sh==1.0

Ahora vamos a cambiar a “venv_2” y a instalar la versión 1.11

(venv_1) ~ > source ~/venv_2/bin/activate
 
(venv_2) ~ > pip install sh==1.11
 
Collecting sh==1.11
 
  Downloading sh-1.11.tar.gz
 
Building wheels for collected packages: sh
 
  Running setup.py bdist_wheel for sh ... done
 
  Stored in directory: /Users/gigi/Library/Caches/pip/wheels/ba/4f/a5/ec77d662c3bf38f564b5ab16f1f3dbb9575922826fe810961c
 
Successfully built sh
 
Installing collected packages: sh
 
Successfully installed sh-1.11
 
(venv_2) ~ > pip freeze | grep sh
 
sh==1.11

Ahora, vamos a volver a cambiar a “venv_1” t a verificar si la versión del paquete sh sigue siendo la 1.0

(venv_2) ~ > source ~/venv_1/bin/activate
 
(venv_1) ~ > pip freeze | grep sh
 
sh==1.0
 
(venv_1) ~ >

Fuente: Gigi Sayfan

 

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP