Volver
Featured image of post Entornos virtuales en Python

Entornos virtuales en Python

Introducción

En nuestras aplicaciones Python solemos hacer uso de librerías, y las diferentes versiones de estas pueden llegar a ser un quebradero de cabeza cuando son usadas desde varias aplicaciones. Además de las librerías, la propia instalación de Python tiene un sistema de versionado, por lo que nos ocurre el mismo problema. Una aplicación A no funciona con Python 3.8 pero la aplicación B lo necesita.

La solución a este problema es usar un entorno virtual, que es un árbol de directorios autónomo que contiene una instalación de Python con una versión concreta, además de una serie de paquetes adicionales que queramos instalar.

Diferentes aplicaciones pueden usar diferentes entornos virtuales. Si una aplicación A necesita una versión 1.0 de un paquete y otra aplicación B la versión 2.0 no tendrán conflictos ya que dentro de cada aplicación habrá un entorno virtual (carpeta) que contenga sus propias instalaciones. Por lo que si dentro de una aplicación B se quiere usar la versión más nueva del paquete 3.0, la aplicación A seguirá usando la versión 1.0 y no se verá afectada. No es estrictamente necesario que el entorno virtual (carpeta) esté dentro del proyecto en cuestión, pero si suele ser una recomendación a la hora de buscar organización y no tener los entornos virtuales desperdigados por el sistema de archivos de nuestra máquina.

Además de solucionar problemas entre las versiones de distintos proyectos, usar entornos virtuales nos permite poder aislar nuestro sistema (PC) de tener que instalar globalmente todas las dependencias que tiene un proyecto, por lo que cuando borremos el proyecto no tendremos todas esas dependencias instaladas en nuestra máquina.

Entornos virtuales desde terminal

Crear entornos virtuales

El módulo de python que permite crear y manejar entornos virtuales se llama venv. Para crear un entorno virtual ejecuta dentro de un directorio:

python3 -m venv tutorial-env
  • python3: por defecto se instalara dentro del entorno virtual la misma versión de python que tengamos instalada en el sistema
  • -m: Indicamos que vamos a introducir el nombre de un módulo de python
  • venv: Es el módulo de python que nos permite crear y manejar entornos virtuales
  • tutorial-env: Es el nombre que le queramos dar al entorno virtual

Una vez creado el entorno virtual procederemos a activarlo, que hará que nuestra terminal tenga el contexto de ese entorno virtual y accederá a los paquetes instalados dentro en lugar de usar la de nuestro sistema.

En windows ejecuta:

tutorial-env\Scripts\activate.bat

En Unix (Linux) o MacOS ejecuta:

source tutorial-env/bin/activate

💡 Si usas otra terminal distinta al bash tienes implementaciones distintas del script de activación como por ejemplo para csh (activate.csh) o fish (activate.fish)

Activar el entorno virtual hará que cambie el prompt de tu terminal para que muetre que entorno virtual se está usando.

raul@DESKTOP:~/env-example$ source tutorial-env/bin/activate

(tutorial-env) raul@DESKTOP:~/env-example$ python3
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Instalar paquetes dentro del entorno virtual

Dentro de nuestro entorno virtual también podemos instalar, actualizar y eliminar paquetes usando el ejecutable pip.

💡 Pip buscará los paquetes en la página https://pypi.org

Para instalar la última versión de un paquete ejecutaremos:

(tutorial-env) raul@DESKTOP:~/env-example$ python3 -m pip install novas
  • (tutorial-env) ⇒ nos muestra que el entorno virtual está activado. Para realizar la instalación de un paquete python dentro del entorno virtual es necesario que lo tengamos activado primero.
  • python3 -m ⇒ Indicamos que vamos a introducir el nombre de un módulo de python, en este caso pip.
  • install ⇒ Para instalar el paquete
  • novas ⇒ nombre del paquete

Y si quisieras instalar una versión específica de un paquete lo podemos realizar concatenando los signos == y la versión del paquete:

(tutorial-env) raul@DESKTOP:~/env-example$ python3 -m pip install requests==2.6.0

Para actualizar el paquete ejecutaríamos un install añadiendo el parámetro –upgrade al comando:

(tutorial-env) raul@DESKTOP:~/env-example$ python3 -m pip install --upgrade requests

Para instalar uno o varios paquetes pon sus nombres después de pip uninstall

Para mostrar información sobre un paquete en particular pon su nombre después de pip show

Para listar todos los paquetes instalados en el entorno virtual podemos ejecutar pip list

Para listar todos los paquetes instalados y además guardar la salida del comando en un fichero de texto que tenga un formato preparado para que instalar todas las versiones a la vez desde pip ejecuta:

(tutorial-env) raul@DESKTOP:~/env-example$ python3 -m pip freeze > requirements.txt

(tutorial-env) raul@DESKTOP:~/env-example$ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
  • freeze ⇒ Similar al list pero expulsa la salida en un formato compatible con la instalación masiva de todos los paquetes que contiene
  • requirements.txt ⇒ Redirigir la salida al archivo especificado. El nombre no tiene que ser exactamente el del ejemplo, pero suele ser un estándar usar ese nombre.

Ejemplo de diferencias entre list y freeze

LIST
novas (3.1.1.3)
numpy (1.9.2)
requests (2.7.0)

FREEZE
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0

El fichero requirements.txt debe ser guardado mediante el control de versiones para que cualquier usuario que se baje el proyecto pueda instalar todas las dependencias necesarias utilizando:

(tutorial-env) raul@DESKTOP:~/env-example$ python3 -m pip install -r requirements.txt
  • -r ⇒ Indica que las dependencias están especificadas en un archivo que vamos a pasar

Entornos virtuales desde IntelliJ IDEA Ultimate o PyCharm

Previamente hemos visto como manejar los entornos virtuales desde terminal, pero en algún momento tendríamos que abrir nuestro proyecto desde un IDE, y en este caso explicaré como manejar los entornos virtuales dentro de los IDEs de Jetbrains.

Requisitos:

  • Si vas a utilizar IntelliJ (Ultimate) en lugar de PyCharm es necesario que tengas instalado el plugin de Python. Lo puedes instalar desde los ajustes del IDE (Ctrl + Alt + S)

  • Se recomienda instalar el plugin “Requirements” para poder manejar de una forma más cómoda y más asistida los requirimientos dentro del proyecto

Crear un entorno virtual

Para crear un entorno virtual desde el IDE abriremos los ajustes de la estructura del proyecto (Ctrl + Shift + Alt + S) y añadiremos un nuevo SDK de Python

  • Base interpreter: En caso de que no tengamos Python instalado en nuestra máquina el IDE nos ofrecerá descargar una versión. Si ya lo tenemos instalado lo autodetectará, pero también podemos indicar una ruta donde esté Python instalado.

  • Inherit global site-packages: Nos incluirá dentro del entorno virtual todos los paquetes que tengamos instalados. Se recomienda deshabilitar si globalmente tenemos muchas dependencias que no sean de necesidad para el proyecto. Corresponde con el parámetro -system-site-packages de virtualenv.

  • Make available to all projects: El IDE guardará el entorno virtual para que pueda ser usado en otro proyectos. Actívalo si sabes que las dependencias de tu proyecto serán las mismas en algún otro proyecto.

Usar un entorno virtual existente

Para usar un entorno virtual existente desde el IDE abriremos los ajustes de la estructura del proyecto (Ctrl + Shift + Alt + S) y añadiremos un SDK de Python

  • Interpreter: Indicaremos la ruta donde está instalado Python dentro del entorno virtual

  • Make available to all projects: El IDE guardará el entorno virtual para que pueda ser usado en otro proyectos. Actívalo si sabes que las dependencias de tu proyecto serán las mismas en algún otro proyecto.

Incluir las dependencias del archivo requirements

Con el plugin “Requirements” instalado en pasos anteriores podremos instalar los paquetes necesarios dentro del archivo requirements.txt

Para sincronizar las dependencias que están instaladas en el entorno virtual y lo que tenemos definido en el archivo requirements.txt en la barra superior del IDE pulsamos sobre “Tools” y elegimos la opción “Sync Python Requirements…”

Entornos virtuales en proyectos versionados

Un entorno virtual no se versiona junto con el proyecto, recordemos que esa carpeta tiene multitud de instalaciones de paquetes de Python y que estaríamos añadiendo una carpeta de mucho peso en el sistema de versionado. El proceso que debemos seguir para recrear el entorno virtual cuando nos bajamos un proyecto de Python es:

  • Crear un entorno virtual nuevo
  • Instalar las dependencias que están especificadas en el archivo requierements.txt del proyecto
Creado con Hugo
Tema Stack diseñado por Jimmy