uv - La Cadena de Herramientas Rápida
uv es un gestor de paquetes de Python todo en uno escrito en Rust. Reemplaza pip, venv, pip-tools y pyenv con una única CLI rápida, siendo el predeterminado recomendado para proyectos Python 3.14.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
# Instalar uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Nuevo proyecto
uv init myapp && cd myapp
uv add fastapi pydantic
uv run uvicorn myapp.main:app --reload
# Proyecto existente
uv sync
uv run pytestCuándo usar esto:
- Al iniciar un nuevo proyecto Python 3.14
- Para reemplazar flujos de trabajo lentos de
pip install+ venv manual - Pipelines de CI que necesitan instalaciones de dependencias en menos de un segundo
- Para gestionar múltiples versiones de Python sin pyenv
Ejemplo de Trabajo
#!/usr/bin/env bash
set -euo pipefail
# Inicializar un servicio FastAPI con uv
uv init invoice-api
cd invoice-api
uv add "fastapi>=0.115" "uvicorn[standard]>=0.34" "pydantic>=2"
cat > src/invoice_api/main.py <<'PY'
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Invoice(BaseModel):
id: int
amount: float
@app.get("/health")
def health() -> dict[str, str]:
return {"status": "ok"}
@app.post("/invoices")
def create(invoice: Invoice) -> Invoice:
return invoice
PY
uv run uvicorn invoice_api.main:app --host 0.0.0.0 --port 8000Lo que esto demuestra:
uv initcrea la estructura depyproject.toml,src/y.venvuv addresuelve dependencias y actualizauv.lockuv runejecuta dentro del entorno del proyecto sin activación manual- Los puntos de entrada se resuelven automáticamente desde el paquete
src/
Inmersión Profunda
Cómo Funciona
- uv utiliza una caché global de paquetes y enlaces duros en directorios
.venvpor proyecto. - La resolución se realiza en Rust, típicamente 10-100 veces más rápido que pip para árboles de dependencias grandes.
uv.lockes un archivo de bloqueo universal (compatible con PEP 751) con versiones exactas y hashes.uv pythongestiona las descargas de intérpretes junto con la gestión de paquetes.
Comandos Principales
| Comando | Propósito |
|---|---|
uv init | Crear un nuevo proyecto con pyproject.toml |
uv add <pkg> | Añadir dependencia de tiempo de ejecución |
uv remove <pkg> | Eliminar dependencia |
uv sync | Instalar desde el archivo de bloqueo |
uv lock | Regenerar el archivo de bloqueo |
uv run <cmd> | Ejecutar comando en el venv del proyecto |
uv pip install | Interfaz de instalación compatible con pip |
uv python install | Descargar intérpretes de Python |
Notas de Python
# Fijar intérprete para el proyecto
uv python pin 3.14
# Ejecutar contra una versión específica sin cambiar el pin
uv run --python 3.13 pytest
# Actualizar todas las dependencias
uv lock --upgradeErrores Comunes
- Olvidar
uv syncdespués de clonar - Las importaciones fallan conModuleNotFoundError. Solución: ejecutaruv sync(ouv sync --frozenen CI) antes de cualquier comando. - Mezclar pip y uv en el mismo venv - Los conflictos de metadatos causan desajustes sutiles de versiones. Solución: elegir una herramienta por proyecto; usar
uv pipsi necesitas semántica de pip. - No confirmar
uv.lock- Los compañeros de equipo obtienen versiones de dependencias diferentes. Solución: confirmar el archivo de bloqueo; usaruv sync --frozenen CI. - Ejecutar
uv addsin actualizar el bloqueo -pyproject.tomly el archivo de bloqueo divergen. Solución:uv addactualiza ambos; si editaspyproject.tomlmanualmente, ejecutauv lockdespués. uv pip installglobal - Contamina el intérprete del sistema. Solución: trabajar siempre dentro de un proyecto (uv init/uv sync) o pasar--pythonexplícitamente.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| pip + venv | Proyectos heredados, herramientas mínimas | Necesitas archivos de bloqueo o velocidad |
| Poetry | El equipo ya está estandarizado en Poetry | Empezando desde cero (uv es más rápido) |
| PDM | Se prefiere el flujo de trabajo PEP 582 __pypackages__ | Quieres un .venv tradicional |
| conda/mamba | Pila científica con bibliotecas C | Aplicaciones web puras de PyPI |
Preguntas Frecuentes
¿uv reemplaza pip por completo?
uv proporciona uv pip para comandos compatibles con pip y uv add/uv sync para flujos de trabajo de proyectos. Puedes migrar incrementalmente.
¿Dónde almacena uv los paquetes descargados?
Una caché global (típicamente ~/.cache/uv/). Los directorios .venv del proyecto se enlazan desde la caché, ahorrando espacio en disco.
¿Puedo usar uv con un requirements.txt existente?
Sí: uv pip install -r requirements.txt. Para mantenimiento a largo plazo, migra a pyproject.toml con uv add.
¿Cómo actualizo una sola dependencia?
uv lock --upgrade-package httpx luego uv sync.
¿uv funciona en Windows?
Sí. Instala a través de powershell -c "irm https://astral.sh/uv/install.ps1 | iex".
¿Cuál es la diferencia entre uv sync y uv run?
uv sync instala dependencias en .venv. uv run ejecuta un comando dentro de ese entorno.
¿Puede uv gestionar dependencias de desarrollo?
Sí. Usa [dependency-groups] en pyproject.toml y uv sync --group dev.
¿Cómo se compara uv con Poetry para publicar?
uv se centra en la velocidad de instalación y la gestión de archivos de bloqueo. Para construir y publicar ruedas, empareja uv con hatchling o usa uv build / uv publish.
¿Debo activar el venv al usar uv?
No. uv run se encarga de la activación del entorno. La activación manual source .venv/bin/activate sigue funcionando si lo prefieres.
¿Cómo configuro un índice privado con uv?
export UV_INDEX_URL=https://pypi.internal/simple/ o configura [[tool.uv.index]] en pyproject.toml.
Relacionado
- Conceptos Básicos de Entornos y Empaquetado - Fundamentos de venv y aislamiento
- pyproject.toml Explicado - Estructura de metadatos del proyecto
- Resolución de Dependencias y Archivos de Bloqueo - Estrategias de fijación
- Gestión de Versiones de Python - Pruebas multi-versión
Versiones de la Pila: Esta página fue escrita para Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.