Entornos virtuales de Python en 2026: venv, uv, pipx, poesía: cuándo usar cuál
Cada tutorial de Python dice "use un entorno virtual" y continúa. Este va más allá: qué ES realmente un venv, las cuatro herramientas que vale la pena conocer en 2026, un árbol de decisiones de 60 segundos para elegir la correcta y los dos errores que arruinan su configuración en una semana.
Qué es realmente un entorno virtual
Un venv es un directorio que contiene un enlace simbólico del intérprete de Python más un `site-packages/` privado. Cuando está "activado", PATH antepone <venv>/bin, por lo que python y pip en su shell apuntan a las copias del venv. pip install X escribe en los site-packages/ del venv, no en el sistema Python.
Eso es todo. Sin magia. Es una carpeta con un enlace simbólico y pyvenv.cfg.
BASH$ python -m venv .venv $ ls .venv/ bin/ include/ lib/ pyvenv.cfg $ cat .venv/pyvenv.cfg home = /opt/homebrew/opt/python@3.13/bin include-system-site-packages = false version = 3.13.2
Todo lo demás (activar scripts, contenedores, administradores de paquetes) es conveniencia además de esta forma.
Por qué necesitas uno, siempre
Sin un venv, pip install X escribe en los site-packages/ de Python de su sistema. Tres problemas:
1. Conflictos. El proyecto A necesita django==4.2; El proyecto B necesita django==5.1. Imposible sin venvs.
2. Reproducibilidad. "Funciona en mi máquina" es un problema del sistema Python. Una instantánea de venv ES el medio ambiente.
3. Limpieza. ¿Eliminar un proyecto? Elimina su carpeta venv. Las instalaciones de System-Python se acumulan para siempre.
En macOS 12+ y la mayoría de las distribuciones de Linux, system-Python ahora es propiedad del sistema operativo; pip puede incluso negarse a instalarse sin --break-system-packages. Esa es una pista.
Las 4 herramientas que vale la pena conocer
1. venv: la línea base stdlib
Se envía con cada instalación de Python 3.3+. Cero dependencias. La alternativa universal:
BASHpython -m venv .venv # create source .venv/bin/activate # macOS / Linux .venv\Scripts\activate # Windows pip install -r requirements.txt deactivate # or close the shell
Úselo cuando: escriba un tutorial, asegúrese de que un script funcione en todas partes o en un CI bloqueado donde no puede instalar nada.
2. uv: el valor predeterminado moderno (2026)
Escrito en óxido, entre 10 y 100 veces más rápido que pip. Reemplaza venv + pip + pip-tools + pyenv-download-python. Consulte nuestro inmersión profunda en uv para conocer el recorrido completo.
BASHuv venv # create venv (uses current Python) uv venv --python 3.13 # or download + pin a version uv pip install -r requirements.txt uv run pytest # run without activating uv add fastapi # append to pyproject.toml + install uv sync # install exactly what pyproject.toml says
Úselo cuando: cualquier proyecto de 2026: solo, en equipo, CI, Docker. La diferencia de velocidad en un caché frío es real (45s pip → 2s uv en un proyecto típico de Django).
3. pipx — para herramientas CLI
Cuando instala una CLI como ruff, httpie, black, youtube-dl, mypy, no la quiere en el venv de su proyecto (¿por qué depender de ruff para que funcione import project.things?). Y no lo quieres en el sistema Python (conflictos). pipx coloca cada uno en su propio venv aislado pero expone la CLI globalmente:
BASHpipx install ruff pipx install httpie pipx install black ruff check . # works from anywhere, no activation httpie GET api.github.com black .
Úselo cuando: instale una CLI basada en Python. Regla general: pipx install X si X incluye un ejecutable que ejecutarías desde cualquier proyecto; uv pip install X si X es una biblioteca que usted importa.
Reemplazo moderno: uv tool install ruff hace lo mismo sin una instalación de pipx por separado. Elija cualquiera de los dos.
4. poetry: armario de dependencia maduro (cuota decreciente)
Antes de que llegara la luz ultravioleta, la "poesía" era la herramienta de embalaje moderna a la que recurrir. Excelente solucionador de dependencias, poetry.lock determinista, estrecha integración con pyproject.toml. Sigue siendo sólido, pero más lento que el ultravioleta y agrega una sobrecarga cognitiva.
BASHpoetry new my-project poetry add fastapi poetry install poetry run pytest poetry publish
Úselo cuando: el proyecto existente ya usa poesía o necesita complementos específicos de poesía (por ejemplo, poetry-plugin-export). Para proyectos NUEVOS en 2026, uv lo lleva más rápido con una huella más pequeña.
El árbol de decisión de 60 segundos
Eso es todo. El 90% de los desarrolladores de Python hoy en día pueden elegir de esta lista sin necesidad de pyenv, virtualenvwrapper, pew o conda.
Conda: el caso especial
conda es un universo separado: administrador de paquetes + administrador venv + distribuidor Python + administrador de biblioteca C, principalmente para Python científico. Si está haciendo un trabajo numérico pesado con pilas numpy/scipy/pandas/GPU que necesitan versiones CUDA + cuDNN coincidentes, miniconda aún puede valer la pena: los binarios precompilados ahorran horas frente a pip.
De lo contrario: uv simple ahora también es competitivo en pilas científicas (las instalaciones de numpy/pandas son segundos, no minutos). No busque conda a menos que necesite específicamente un punto de enlace de biblioteca C que no pueda producir fácilmente.
Los dos errores que arruinan tu configuración en una semana
1. Comprometer .venv/ con git
Un venv contiene:
- Rutas absolutas a su instalación específica de Python.
- Archivos
.pyccompilados. - Binarios que son específicos del sistema operativo.
Confirma que → tu compañero de equipo en Windows no puede ejecutar nada. Agregue .venv/ (y venv/, .env/) a su .gitignore PRIMERO, luego cree el archivo venv.
2. Activar en el shell incorrecto
source .venv/bin/activate establece variables de entorno solo en el shell ACTUAL. Si abre una nueva pestaña de terminal, volverá al sistema Python. Dos patrones seguros:
1. Reactivar cada sesión: el flujo estándar.
2. `uv run` / `poetry run` / `python -m project` — nunca activarlo en absoluto. Ejecute comandos desde un shell nuevo con el prefijo de la herramienta. Excelente en Makefiles, CI, npm-scripts, git hooks.
Regla para scripts: si se trata de una ejecución de una sola línea desde CI o un Makefile, NO lo active; use uv run pytest o la ruta completa .venv/bin/pytest. La activación es sólo para shells interactivos.
Migración entre herramientas
pip + venv → uv:
BASHrm -rf .venv uv venv uv pip install -r requirements.txt
Requisitos.txt sigue funcionando palabra por palabra. Dos minutos.
poesía → uv:
BASHuvx migrate-to-uv # community tool, converts pyproject.toml
venv → poesía:
BASHpoetry init poetry add $(pip freeze | cut -d= -f1)
Verificación
Después de la configuración, siempre verifica QUÉ Python + pip estás usando:
BASH$ which python /path/to/project/.venv/bin/python # ✅ venv /opt/homebrew/bin/python # ❌ system, activation didn't take $ which pip /path/to/project/.venv/bin/pip # ✅ venv $ python -c "import sys; print(sys.prefix)" /path/to/project/.venv # ✅ venv
Si "what python" muestra una ruta del sistema después de la activación, algo anda mal; generalmente lo activaste en una subcapa que ya salió.
Los entornos virtuales son uno de los pocos temas de Python donde la respuesta moderna (2026) es realmente más simple que la respuesta histórica. uv para nuevos proyectos, venv para scripts, pipx para CLI. Hecho.
Siguiente paso: la pista de Python DevOps cubre uv + ruff + Docker + la pila de implementación moderna de Python: práctica con Python real ejecutándose en su navegador.