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