Herramientas
5 min

uv — Gestionando +80 entornos virtuales en producción

Trubi

Lucas Trubiano

10 de julio de 2026

uv — Gestionando +80 entornos virtuales en producción

En este artículo comparto nuestra experiencia:

  • Cómo acortamos de días a minutos el setup para los nuevos onboardings.
  • Reemplazando nuestro stack (pip, pyenv y virtualenv) por una sola herramienta (uv).
  • Gestionando +80 entornos virtuales de Python en producción.
  • Limpiando +20 GB de entornos zombies.
  • Acelerando todos nuestros run, build y deploys hasta 10x.

¿Qué es uv?

uv es un gestor de paquetes y proyectos de Python extremadamente rápido, escrito en Rust. Su objetivo es reemplazar múltiples herramientas de Python como pip, poetry, pyenv y virtualenv con una única solución de alto rendimiento.

Características principales

  • Reemplaza pip, poetry, pyenv, virtualenv, etc. por una sola herramienta.
  • Está escrita en Rust, lo que la hace 10-100 veces más rápida que pip.
  • Compatible con pyproject.toml y archivos .lock.
  • Eficiente en el uso del espacio en disco, con un caché global para la deduplicación de dependencias.

uv cuenta con el respaldo de Astral, los creadores de Ruff.

Comparativa de pip, pyenv y virtualenv vs uv, con benchmark de velocidad de instalación

Instalación

Instala uv siguiendo los pasos de la guía oficial de instalación.

Uso básico

Gestión de versiones de Python

bash
# Instalar versiones de Python
uv python install 3.10 3.11 3.12

# Crear entorno virtual con versión específica de Python
uv venv --python 3.11

Gestión de proyectos

bash
# --- Primera vez ---

# Inicializar un nuevo proyecto
uv init mi_proyecto

# Crear un entorno virtual
uv venv

# --- Agregar dependencias ---

# Activar el entorno virtual
# En Linux/macOS
source .venv/bin/activate
# En Windows
# .venv\Scripts\activate

# Añadir/Quitar dependencias iniciales
uv add requests pandas numpy
uv remove pandas

# Sincronizar dependencias basadas en el archivo de bloqueo
uv sync

Ejecución de scripts

bash
# Ejecutar un script Python con dependencias
uv run script.py

# Añadir dependencias a un script
uv add --script script.py requests

Gestión de herramientas

bash
# Ejecutar una herramienta en un entorno efímero
uvx ruff check .

# Instalar una herramienta
uv tool install ruff

Para información más detallada y guías, visitá la documentación oficial de uv.

Gestionando entornos en producción con uv

Problema y contexto

Nuestro contexto: repos con más de 300 DAGs de Airflow (MWAA) corriendo sobre EC2, con más de 80 scripts, cada uno con su propio entorno virtual y su requirements.txt. El onboarding de un nuevo desarrollador implicaba instalar pyenv, crear y activar entornos manualmente, e instalar dependencias con pip uno por uno.

Diagrama de arquitectura: repos en S3/CI-CD, Airflow (MWAA) en AWS orquestando EC2 vía SSH, con carpetas de scripts y entornos virtuales

Esto generaba varios problemas:

  • Onboarding chaos: setup de PC lento, commits sin tests o deploys con fallos.
  • Gestión manual de venvs: instalar y mantener entornos a mano en EC2.
  • Storage full: entornos zombies acumulando espacio en disco.

Toda esta carga operativa recayó sobre el equipo, así que decidimos implementar uv y adoptar dos estrategias.

Esquema del problema: onboarding chaos y gestión manual de venvs generan carga operativa, resuelto implementando uv con dos estrategias: entornos administrados y efímeros

Estrategias de implementación

Entornos administrados

Para procesos recurrentes con dependencias estables, mantenemos un entorno virtual por proyecto, versionado junto al código.

Flujo de entornos administrados: onboarding, dev con uv sync y admin con uv init, uv venv, uv add/remove

bash
# ADMIN
mkdir <proyecto>
cd <proyecto>

uv init
# Completar el pyproject.toml:
# [] Descripción y nombre del proyecto
# [] Author y README.md
# [] Versión de Python
uv venv --python 3.X
# uv sync

source .venv/bin/activate
uv add requests
# uv remove requests
bash
# DEV
cd <proyecto>

# uv sync
uv run main.py

Entornos efímeros

Para scripts puntuales o de uso esporádico, usamos entornos efímeros: uv resuelve e instala las dependencias declaradas directamente en el script, sin necesidad de mantener un .venv persistente.

Estructura de entornos efímeros: carpeta de scripts con pyproject.toml, y ejemplo de script Python con metadata inline de dependencias, ejecutado con uv run

python
# /// script
# requires-python = ">=3.12"
# dependencies = [
#     "boto3",
#     "requests"
# ]
# ///

import boto3
import requests

# ... resto del código
# uv run main.py

Impacto y beneficio

Resumen de impacto: +80 venvs en producción, fricción de setup reducida de días a minutos, 3 herramientas reemplazadas por uv, -20 GB de entornos zombies/duplicados, 10x en run/build/deploy

  • +80 venvs en producción, gestionados con una sola herramienta.
  • Fricción en el setup: de días a minutos.
  • 3 herramientas (pip, pyenv, virtualenv) reemplazadas por uv.
  • -20 GB de entornos zombies y duplicados eliminados.
  • 10x de mejora en run, build y deploy.

Tip: si tenés múltiples scripts independientes con pocas dependencias, preferí entornos efímeros con metadata inline (uv run script.py) en vez de mantener un .venv por cada uno — te ahorra limpieza y espacio en disco.