Entornos virtuales en Python
Los entornos virtuales son una de esas herramientas que parecen opcionales hasta que trabajas en varios proyectos Python simultáneamente y las dependencias empiezan a entrar en conflicto.
El problema real que resuelven
Imagina que tienes dos proyectos:
- Proyecto A necesita
requests==2.28.0 - Proyecto B necesita
requests==2.31.0
Si instalas las librerías globalmente (en el sistema), solo puedes tener una versión instalada. Cuando cambias de proyecto, tienes que desinstalar y reinstallar. En proyectos profesionales esto es inviable.
Un entorno virtual crea una instalación Python aislada por proyecto. Cada proyecto tiene sus propias dependencias independientes.
Crear y activar
# Crear el entorno virtual
python -m venv venvEl segundo venv es el nombre de la carpeta donde se creará. Podrías llamarlo diferente (por ejemplo .env), pero venv es la convención más extendida.
Activar en Windows
venv\Scripts\activateActivar en Mac/Linux
source venv/bin/activateDesactivar
deactivateCuando ves (venv) al inicio de tu terminal, significa que el entorno está activo. Todas las operaciones de Python y pip afectarán solo a ese entorno.
uv — la alternativa moderna que uso ahora
uv es un gestor de paquetes y entornos para Python escrito en Rust. Es 10-100x más rápido que pip y reemplaza tanto a venv como a pip con una sola herramienta.
# Instalar uv
pip install uv
# Crear entorno + instalar deps + lock, todo en uno
uv venv
uv pip install -r requirements.txt
# O directamente desde pyproject.toml
uv syncLo uso en proyectos nuevos. En legacy, sigo con python -m venv + pip.
Gestionar dependencias
Instalar una librería
pip install requestsVer librerías instaladas
pip listSalida típica:
Package Version
---------- -------
requests 2.31.0
flask 3.0.0
python-dotenv 1.0.0Guardar las dependencias del proyecto
pip freeze > requirements.txtEl archivo requirements.txt ahora contiene todas las librerías con sus versiones exactas. Esto permite que cualquier persona pueda replicar tu entorno con:
pip install -r requirements.txtAlternativas a pip freeze
pip freeze lista todas las dependencias, incluyendo las transitivas (librerías que tus librerías necesitan). Esto puede ser overkill.
pipreqs: solo las dependencias que tu código realmente usa:
pip install pipreqs
pipreqs ./proyectopoetry: gestión moderna de dependencias con pyproject.toml:
pip install poetry
poetry add requestsEstructura recomendada de un proyecto Python
mi-proyecto/
├── venv/ # Entorno virtual (no hacer commit)
├── src/
│ └── mi_paquete/ # Tu código como paquete
│ ├── __init__.py
│ └── main.py
├── tests/
│ └── test_main.py
├── requirements.txt # Dependencias
├── requirements-dev.txt # Dependencias de desarrollo
└── README.md¿Por qué src/?
Separar el código de la raíz permite que el proyecto se importe correctamente como paquete:
from mi_paquete import mainSin la carpeta src/, podrías tener problemas de imports cuando alguien instale tu paquete con pip install.
Ejemplo práctico: crear un script desde cero
# 1. Crear proyecto y entrar
mkdir mi-script && cd mi-script
# 2. Crear entorno virtual
python -m venv venv
# 3. Activar
venv\Scripts\activate # Windows
# source venv/bin/activate # Mac/Linux
# 4. Instalar dependencias
pip install requests python-dotenv
# 5. Guardar dependencias
pip freeze > requirements.txt
# 6. Crear estructura
mkdir src && touch src/__init__.py
# 7. Crear script
cat > src/main.py << 'EOF'
import requests
from dotenv import load_dotenv
import os
load_dotenv()
def fetch_data(url):
response = requests.get(url)
return response.json()
if __name__ == "__main__":
data = fetch_data("https://api.github.com/users/mmoreno-byte")
print(f"Nombre: {data['name']}")
EOFIntegración con VSCode
- Instala la extensión Python (Microsoft)
- Abre la paleta de comandos (
Ctrl+Shift+P) - Busca Python: Select Interpreter
- Selecciona el Python dentro de
venv/Scripts/python.exe(Windows) ovenv/bin/python(Mac/Linux)
Ahora, al ejecutar código o abrir la terminal integrada, VSCode usará automáticamente el entorno virtual correcto.
Buenas prácticas
- Nunca hagas commit de
venv/— añadevenv/a.gitignore - Sempre usa entorno virtual — aunque sea un script de una línea
- Documenta las versiones —
requirements.txtopyproject.tomles tu fuente de verdad - Separa dependencias de desarrollo —
requirements-dev.txtpara herramientas de testing comopytest
Entornos virtuales en el contexto de FastAPI/Flask
Cuando trabajas con frameworks como FastAPI o Flask, el patrón típico es:
# Backend del proyecto
cd backend
python -m venv venv
source venv/bin/activate
pip install fastapi uvicorn pandas
pip freeze > requirements.txtEl frontend y el backend son proyectos separados con sus propios entornos virtuales.
Los entornos virtuales son como el aislamiento de proyectos en un IDE: al principio parecen trabajo extra, pero cuando descubres que no puedes vivir sin ellos, entiendes por qué son el estándar.
Más información y guías en mmoreno.dev.