Saltar al contenido

Entornos Virtuales

Cuando trabajas en proyectos de Python probablemente deberías usar un entorno virtual (o un mecanismo similar) para aislar los paquetes que instalas para cada proyecto.

Nota

Si ya sabes sobre entornos virtuales, cómo crearlos y usarlos, quizás quieras saltarte esta sección. 🤓

Consejo

Un entorno virtual es diferente a una variable de entorno.

Una variable de entorno es una variable en el sistema que puede ser usada por los programas.

Un entorno virtual es un directorio con algunos archivos dentro.

Nota

Esta página te enseñará cómo usar entornos virtuales y cómo funcionan.

Si estás listo para adoptar una herramienta que maneja todo por ti (incluyendo instalar Python), prueba uv.

Crear un Proyecto

Primero, crea un directorio para tu proyecto.

Lo que normalmente hago es crear un directorio llamado code dentro de mi directorio home/user.

Y dentro de ese creo un directorio por proyecto.

fast →cdmkdir codecd codemkdir awesome-projectcd awesome-project
restart ↻

Crear un Entorno Virtual

Cuando empiezas a trabajar en un proyecto de Python por primera vez, crea un entorno virtual dentro de tu proyecto.

Consejo

Solo necesitas hacer esto una vez por proyecto, no cada vez que trabajas.

Para crear un entorno virtual, puedes usar el módulo venv que viene con Python.

fast →python -m venv .venv
restart ↻
Lo que significa ese comando
  • python: usa el programa llamado python
  • -m: llama a un módulo como un script, le diremos qué módulo a continuación
  • venv: usa el módulo llamado venv que normalmente viene instalado con Python
  • .venv: crea el entorno virtual en el nuevo directorio .venv

Si tienes uv instalado, puedes usarlo para crear un entorno virtual.

Consejo

Por defecto, uv creará un entorno virtual en un directorio llamado .venv.

Pero podrías personalizarlo pasando un argumento adicional con el nombre del directorio.

Ese comando crea un nuevo entorno virtual en un directorio llamado .venv.

.venv u otro nombre

Podrías crear el entorno virtual en un directorio diferente, pero hay una convención de llamarlo .venv.

Activar el Entorno Virtual

Activa el nuevo entorno virtual para que cualquier comando de Python que ejecutes o paquete que instales lo use.

Consejo

Haz esto cada vez que inicies una nueva sesión de terminal para trabajar en el proyecto.

fast →source .venv/bin/activate
restart ↻
fast →.venv\Scripts\Activate.ps1
restart ↻

O si usas Bash para Windows (ej. Git Bash):

fast →source .venv/Scripts/activate
restart ↻

Consejo

Cada vez que instales un nuevo paquete en ese entorno, activa el entorno nuevamente.

Esto asegura que si usas un programa de terminal (CLI) instalado por ese paquete, uses el de tu entorno virtual y no cualquier otro que podría estar instalado globalmente, probablemente con una versión diferente a la que necesitas.

Verificar que el Entorno Virtual esté Activo

Verifica que el entorno virtual esté activo (el comando anterior funcionó).

Consejo

Esto es opcional, pero es una buena forma de verificar que todo está funcionando como se espera y que estás usando el entorno virtual que querías.

fast →which python
/home/user/code/awesome-project/.venv/bin/python

restart ↻

Si muestra el binario de python en .venv/bin/python, dentro de tu proyecto (en este caso awesome-project), entonces funcionó. 🎉

fast →Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python

restart ↻

Si muestra el binario de python en .venv\Scripts\python, dentro de tu proyecto (en este caso awesome-project), entonces funcionó. 🎉

Actualizar pip

Consejo

Si usas uv lo usarías para instalar cosas en lugar de pip, así que no necesitas actualizar pip. 😎

Si estás usando pip para instalar paquetes (viene por defecto con Python), deberías actualizarlo a la última versión.

Muchos errores exóticos al instalar un paquete se resuelven simplemente actualizando pip primero.

Consejo

Normalmente harías esto una vez, justo después de crear el entorno virtual.

Asegúrate de que el entorno virtual esté activo (con el comando anterior) y luego ejecuta:

fast →python -m pip install --upgrade pip

restart ↻

Consejo

A veces, podrías obtener un error No module named pip al intentar actualizar pip.

Si esto ocurre, instala y actualiza pip usando el comando a continuación:

fast →python -m ensurepip --upgrade

restart ↻

Este comando instalará pip si aún no está instalado y también asegurará que la versión instalada de pip sea al menos tan reciente como la disponible en ensurepip.

Añadir .gitignore

Si estás usando Git (deberías), añade un archivo .gitignore para excluir todo lo que esté en tu .venv de Git.

Consejo

Si usaste uv para crear el entorno virtual, ya hizo esto por ti, puedes saltarte este paso. 😎

Consejo

Haz esto una vez, justo después de crear el entorno virtual.

fast →echo "*" > .venv/.gitignore
restart ↻
Lo que significa ese comando
  • echo "*": "imprimirá" el texto * en la terminal (la siguiente parte cambia eso un poco)
  • >: cualquier cosa impresa en la terminal por el comando a la izquierda de > no debe imprimirse sino escribirse en el archivo que va a la derecha de >
  • .gitignore: el nombre del archivo donde el texto debe escribirse

Y * para Git significa "todo". Así, ignorará todo en el directorio .venv.

Ese comando creará un archivo .gitignore con el contenido:

*

Instalar Paquetes

Después de activar el entorno, puedes instalar paquetes en él.

Consejo

Haz esto una vez al instalar o actualizar los paquetes que tu proyecto necesita.

Si necesitas actualizar una versión o añadir un nuevo paquete, harías esto nuevamente.

Instalar Paquetes Directamente

Si tienes prisa y no quieres usar un archivo para declarar los requisitos de paquetes de tu proyecto, puedes instalarlos directamente.

Consejo

Es una (muy) buena idea poner los paquetes y versiones que tu programa necesita en un archivo (por ejemplo requirements.txt o pyproject.toml).

fast →pip install "fastapi[standard]"

restart ↻

Si tienes uv:

fast →uv pip install "fastapi[standard]"████████████████████████████████████████ 100%
restart ↻

Instalar desde requirements.txt

Si tienes un requirements.txt, ahora puedes usarlo para instalar sus paquetes.

fast →pip install -r requirements.txt
restart ↻

Si tienes uv:

fast →uv pip install -r requirements.txt████████████████████████████████████████ 100%
restart ↻
requirements.txt

Un requirements.txt con algunos paquetes podría verse así:

fastapi[standard]==0.113.0
pydantic==2.8.0

Ejecutar Tu Programa

Después de activar el entorno virtual, puedes ejecutar tu programa, y usará el Python dentro de tu entorno virtual con los paquetes que instalaste ahí.

fast →python main.py
Hello World

restart ↻

Configurar Tu Editor

Probablemente usarías un editor, asegúrate de configurarlo para usar el mismo entorno virtual que creaste (probablemente lo autodetectará) para que puedas tener autocompletado y errores en línea.

Por ejemplo:

Consejo

Normalmente solo tienes que hacer esto una vez, cuando creas el entorno virtual.

Desactivar el Entorno Virtual

Una vez que terminas de trabajar en tu proyecto puedes desactivar el entorno virtual.

De esta manera, cuando ejecutes python no intentará ejecutarlo desde ese entorno virtual con los paquetes instalados ahí.

Listo para Trabajar

Ahora estás listo para empezar a trabajar en tu proyecto.

Consejo

¿Quieres entender qué es todo eso de arriba?

Continúa leyendo. 👇🤓

Por qué Entornos Virtuales

Para trabajar con FastAPI necesitas instalar Python.

Después de eso, necesitarías instalar FastAPI y cualquier otro paquete que quieras usar.

Para instalar paquetes normalmente usarías el comando pip que viene con Python (o alternativas similares).

Sin embargo, si simplemente usas pip directamente, los paquetes se instalarían en tu entorno global de Python (la instalación global de Python).

El Problema

Entonces, ¿cuál es el problema con instalar paquetes en el entorno global de Python?

En algún momento, probablemente terminarás escribiendo muchos programas diferentes que dependen de diferentes paquetes. Y algunos de estos proyectos en los que trabajas dependerán de diferentes versiones del mismo paquete. 😱

Por ejemplo, podrías crear un proyecto llamado philosophers-stone, este programa depende de otro paquete llamado harry, usando la versión 1. Así que necesitas instalar harry.

Luego, en algún momento después, creas otro proyecto llamado prisoner-of-azkaban, y este proyecto también depende de harry, pero este proyecto necesita harry versión 3.

Pero ahora el problema es, si instalas los paquetes globalmente (en el entorno global) en lugar de en un entorno virtual local, tendrás que elegir qué versión de harry instalar.

Si quieres ejecutar philosophers-stone necesitarás primero instalar harry versión 1, por ejemplo con:

fast →pip install "harry==1"
restart ↻

Y entonces terminarías con harry versión 1 instalado en tu entorno global de Python.

Pero entonces si quieres ejecutar prisoner-of-azkaban, necesitarás desinstalar harry versión 1 e instalar harry versión 3 (o simplemente instalar la versión 3 desinstalaría automáticamente la versión 1).

fast →pip install "harry==3"
restart ↻

Y entonces terminarías con harry versión 3 instalado en tu entorno global de Python.

Y si intentas ejecutar philosophers-stone nuevamente, hay una posibilidad de que no funcione porque necesita harry versión 1.

Consejo

Es muy común en los paquetes de Python intentar hacer lo mejor para evitar cambios que rompan en nuevas versiones, pero es mejor estar seguro, e instalar versiones más nuevas intencionalmente y cuando puedas ejecutar las pruebas para verificar que todo funciona correctamente.

Ahora, imagina eso con muchos otros paquetes de los que todos tus proyectos dependen. Eso es muy difícil de manejar. Y probablemente terminarías ejecutando algunos proyectos con algunas versiones incompatibles de los paquetes, y sin saber por qué algo no funciona.

Además, dependiendo de tu sistema operativo (ej. Linux, Windows, macOS), podría haber venido con Python ya instalado. Y en ese caso probablemente tenía algunos paquetes pre-instalados con algunas versiones específicas necesarias para tu sistema. Si instalas paquetes en el entorno global de Python, podrías terminar rompiendo algunos de los programas que venían con tu sistema operativo.

Dónde se Instalan los Paquetes

Cuando instalas Python, este crea algunos directorios con algunos archivos en tu computadora.

Algunos de estos directorios son los encargados de tener todos los paquetes que instalas.

Cuando ejecutas:

fast →pip install "fastapi[standard]"
restart ↻

Eso descargará un archivo comprimido con el código de FastAPI, normalmente desde PyPI.

También descargará archivos para otros paquetes de los que FastAPI depende.

Luego extraerá todos esos archivos y los pondrá en un directorio en tu computadora.

Por defecto, pondrá esos archivos descargados y extraídos en el directorio que viene con tu instalación de Python, ese es el entorno global.

Qué son los Entornos Virtuales

La solución a los problemas de tener todos los paquetes en el entorno global es usar un entorno virtual para cada proyecto en el que trabajas.

Un entorno virtual es un directorio, muy similar al global, donde puedes instalar los paquetes para un proyecto.

De esta manera, cada proyecto tendrá su propio entorno virtual (directorio .venv) con sus propios paquetes.

Qué Significa Activar un Entorno Virtual

Cuando activas un entorno virtual, por ejemplo con:

fast →source .venv/bin/activate
restart ↻
fast →.venv\Scripts\Activate.ps1
restart ↻

O si usas Bash para Windows (ej. Git Bash):

fast →source .venv/Scripts/activate
restart ↻

Ese comando creará o modificará algunas variables de entorno que estarán disponibles para los siguientes comandos.

Una de esas variables es la variable PATH.

Consejo

Puedes aprender más sobre la variable de entorno PATH en la sección Variables de Entorno.

Activar un entorno virtual añade su path .venv/bin (en Linux y macOS) o .venv\Scripts (en Windows) a la variable de entorno PATH.

Digamos que antes de activar el entorno, la variable PATH se veía así:

/usr/bin:/bin:/usr/sbin:/sbin

Eso significa que el sistema buscaría programas en:

  • /usr/bin
  • /bin
  • /usr/sbin
  • /sbin
C:\Windows\System32

Eso significa que el sistema buscaría programas en:

  • C:\Windows\System32

Después de activar el entorno virtual, la variable PATH se vería algo así:

/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin

Eso significa que el sistema ahora empezará a buscar primero programas en:

/home/user/code/awesome-project/.venv/bin

antes de buscar en los otros directorios.

Así, cuando escribes python en la terminal, el sistema encontrará el programa Python en

/home/user/code/awesome-project/.venv/bin/python

y usar ese.

C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32

Eso significa que el sistema ahora empezará a buscar primero programas en:

C:\Users\user\code\awesome-project\.venv\Scripts

antes de buscar en los otros directorios.

Así, cuando escribes python en la terminal, el sistema encontrará el programa Python en

C:\Users\user\code\awesome-project\.venv\Scripts\python

y usar ese.

Un detalle importante es que pondrá el path del entorno virtual al principio de la variable PATH. El sistema lo encontrará antes de encontrar cualquier otro Python disponible. De esta manera, cuando ejecutes python, usará el Python del entorno virtual en lugar de cualquier otro python (por ejemplo, un python de un entorno global).

Activar un entorno virtual también cambia un par de otras cosas, pero esta es una de las más importantes que hace.

Verificar un Entorno Virtual

Cuando verificas si un entorno virtual está activo, por ejemplo con:

fast →which python
/home/user/code/awesome-project/.venv/bin/python

restart ↻
fast →Get-Command python
C:\Users\user\code\awesome-project\.venv\Scripts\python

restart ↻

Eso significa que el programa python que se usará es el que está en el entorno virtual.

Usas which en Linux y macOS y Get-Command en Windows PowerShell.

La forma en que funciona ese comando es que irá y revisará en la variable de entorno PATH, recorriendo cada path en orden, buscando el programa llamado python. Una vez que lo encuentra, te mostrará el path a ese programa.

La parte más importante es que cuando llamas a python, ese es el exacto "python" que se ejecutará.

Así, puedes confirmar si estás en el entorno virtual correcto.

Consejo

Es fácil activar un entorno virtual, obtener un Python, y luego ir a otro proyecto.

Y el segundo proyecto no funcionaría porque estás usando el Python incorrecto, de un entorno virtual para otro proyecto.

Es útil poder verificar qué python se está usando. 🤓

Por qué Desactivar un Entorno Virtual

Por ejemplo, podrías estar trabajando en un proyecto philosophers-stone, activar ese entorno virtual, instalar paquetes y trabajar con ese entorno.

Y luego quieres trabajar en otro proyecto prisoner-of-azkaban.

Vas a ese proyecto:

fast →cd ~/code/prisoner-of-azkaban
restart ↻

Si no desactivas el entorno virtual de philosophers-stone, cuando ejecutes python en la terminal, intentará usar el Python de philosophers-stone.

fast →cd ~/code/prisoner-of-azkaban
python main.py
Traceback (most recent call last):
File "main.py", line 1, in
import sirius

restart ↻

Pero si desactivas el entorno virtual y activas el nuevo para prisoner-of-azkaban entonces cuando ejecutes python usará el Python del entorno virtual en prisoner-of-azkaban.

fast →cd ~/code/prisoner-of-azkaban
deactivate
source .venv/bin/activate
python main.py
I solemnly swear 🐺

restart ↻

Alternativas

Esta es una guía simple para que empieces y te enseñe cómo funciona todo por debajo.

Hay muchas alternativas para manejar entornos virtuales, dependencias de paquetes (requisitos), proyectos.

Una vez que estés listo y quieras usar una herramienta para manejar todo el proyecto, dependencias de paquetes, entornos virtuales, etc. Te sugeriría que pruebes uv.

uv puede hacer muchas cosas, puede:

  • Instalar Python por ti, incluyendo diferentes versiones
  • Manejar el entorno virtual para tus proyectos
  • Instalar paquetes
  • Manejar las dependencias y versiones de paquetes para tu proyecto
  • Asegurar que tengas un conjunto exacto de paquetes y versiones para instalar, incluyendo sus dependencias, para que puedas estar seguro de que puedes ejecutar tu proyecto en producción exactamente igual que en tu computadora mientras desarrollas, esto se llama locking
  • Y muchas otras cosas

Conclusión

Si leíste y entendiste todo esto, ahora sabes mucho más sobre entornos virtuales que muchos desarrolladores por ahí. 🤓

Conocer estos detalles probablemente será útil en un futuro cuando estés depurando algo que parece complejo, pero sabrás cómo funciona todo por debajo. 😎