- uv simplifica de forma revolucionaria la instalación de Python y la gestión de entornos virtuales, resolviendo los problemas de configuración compleja de entornos en el ecosistema Python
- Escrito en Rust, ofrece velocidad y estabilidad, y maneja instalación de versiones de Python, gestión de paquetes y resolución de dependencias con un solo comando
- Reconoce automáticamente
pyproject.toml y configura el entorno del proyecto, y con uv sync permite reproducir un entorno de desarrollo completamente idéntico entre equipos
- Con comandos como
uv run, uv add y uvx, permite ejecutar sin activar el entorno virtual, además de agregar paquetes y hacer ejecuciones puntuales
- Al garantizar consistencia en la instalación y ejecución de Python, uv es visto como un punto de inflexión que eleva significativamente la productividad de los desarrolladores y la eficiencia de colaboración
Resumen de uv
- uv es una herramienta gratuita y de código abierto para administrar Python desarrollada por Astral, con el objetivo de simplificar el complejo proceso de configuración de entornos
- Astral es el equipo detrás de herramientas de desarrollo Python como Ruff
- uv permite instalar versiones de Python, instalar paquetes, administrar entornos virtuales y resolver dependencias, y en velocidad es muy superior a las herramientas existentes
- Está desarrollado en Rust, por lo que ofrece un rendimiento excelente y funciona en casi cualquier plataforma, incluyendo macOS, Linux y Windows
Instalación y uso básico
- La instalación es muy sencilla y puede hacerse con una sola línea usando
curl o un comando de PowerShell
- Como no modifica la instalación existente de Python, se puede probar con seguridad
Gestión del entorno del proyecto
- uv administra automáticamente el entorno virtual de cada proyecto Python y configura el entorno al detectar el archivo
pyproject.toml
- En
pyproject.toml se definen la versión de Python, la lista de dependencias, el nombre y la versión del proyecto, entre otros datos
- Ejemplo:
[project]
name = "my_project"
version = "1.0.0"
requires-python = ">=3.9,<3.13"
dependencies = ["astropy>=5.0.0", "pandas>=1.0.0,<2.0"]
- Este enfoque ofrece una definición de entorno más clara y estandarizada que pip
Crear un proyecto nuevo
- Con el comando
uv init se puede crear fácilmente un proyecto nuevo
- Crea automáticamente archivos esenciales como
pyproject.toml y README.md
- Admite distintos tipos de inicialización con opciones como
--bare y --package
- Se pueden revisar las opciones detalladas con
uv init --help
Sincronizar un proyecto existente
- Si el proyecto ya tiene
pyproject.toml, puede usarse de inmediato con el comando uv sync
- Instala automáticamente la versión de Python
- Crea un entorno virtual en el directorio
.venv
- Genera
uv.lock, que registra la información exacta de versión de todos los paquetes
- Con el comando
uv run se pueden ejecutar scripts de Python sin activar el entorno
- Ejemplos:
uv run myscript.py, uv run jupyter lab
Gestión de dependencias y versiones de Python
- Con
uv add numpy>=2.0 es posible agregar y administrar dependencias automáticamente
- No hace falta editar
pyproject.toml manualmente
- Con
uv python pin 3.12.9 se puede fijar una versión específica de Python, garantizando la reproducibilidad del entorno
uvx: ejecución puntual rápida
uvx es un comando que permite ejecutar herramientas directamente sin configurar un entorno aparte
- Ejemplos:
uvx ruff, uvx jupyter lab, uvx --with pandas,pyarrow ipython
- Gracias al caché, puede re-ejecutarse muy rápido, lo que lo hace útil para trabajo experimental
- Así, los desarrolladores pueden configurar fácilmente entornos temporales de ejecución sin depender de un entorno virtual fijo
Si esto todavía no te convence: una nota personal
- Durante el desarrollo de The Astrosky Ecosystem, se adoptó uv para unificar el entorno Python en múltiples sistemas operativos
- Ayudó a que todos los desarrolladores y servidores usaran exactamente la misma instalación de Python y las mismas versiones de dependencias
- uv también administra el entorno Python en GitHub Actions y en los servidores de producción
- Gracias a uv, desaparecieron los problemas de desajuste entre entornos de instalación y prueba, y la colaboración entre desarrolladores se volvió más simple
Conclusión
- uv elimina de raíz la complejidad de instalar y administrar Python, y permite que los desarrolladores colaboren de forma estable en un mismo entorno
- Gracias a su velocidad y a la estabilidad de su base en Rust, uv es considerado “la mayor innovación que ha ocurrido en el ecosistema Python en la última década”
7 comentarios
Pensé que
pdmera casi muy similar auv, pero no se habla mucho depdm.Parece que las publicaciones sobre uv ya no cambian mucho en contenido.
Maven y Gradle también..
Opiniones en Hacker News
Antes se decía que el tooling de Python era suficiente, pero ahora que los desarrolladores de Python han probado un ecosistema basado en lockfiles como npm, cargo o bundler, da gusto ver que por fin entienden sus ventajas
npm también tiene problemas, pero las instalaciones consistentes y los archivos de bloqueo son un concepto realmente excelente
Sorprende que la gestión de entornos haya sido tan incómoda durante tanto tiempo
No sé si tantos intentos fallaron simplemente por la dificultad de la gestión de paquetes, o si hacía falta financiamiento de VC
pip freeze > requirements.txtypip install -r requirements.txtSi no usas rangos de versiones, en la práctica
requirements.txtcumple la función de lockfilePor eso me parece que el entusiasmo reciente por el “lockfile oficial” está un poco exagerado
Creo que la llegada de yarn fue clave para que npm mejorara
Es más rápido, más eficiente y determinista
Para más detalles, ver pnpm.io/motivation
Con scripts de UV fue posible distribuir clientes/servidores MCP en un solo archivo
Artículo relacionado: MCP server in a file
La mayoría de mis scripts son de un solo archivo, así que agregar esto al principio simplifica muchísimo la vida
#!/usr/bin/env -S uv run --scriptAsí el script se comporta como si fuera un ejecutable independiente, y uv instala automáticamente los módulos necesarios
porque quien escribió el script podría ocultar dependencias maliciosas
Estaría bien tener una función de lista blanca
Aunque algunos paquetes no detectan la fecha de lanzamiento (por ejemplo, yaml)
/usr/bin/env -S, y en los nombres de dependencias debes usar el nombre del paquete de distribución que usa el comandouv pip installEsto sigue el estándar PEP 723 y pipx también lo soporta
Antes de usar uv no me interesaba Rust, pero gracias a uv ahora muevo a Rust el código sensible al rendimiento
Ojalá conda desapareciera por completo. En clústeres de ML los entornos de conda se vuelven enormes y además pierden reproducibilidad
Antes estaba bastante satisfecho con la combinación pyenv + venv + pip + pipx, pero uv
uv run,uv addy demás, la usabilidad mejoró muchísimoEs mucho más cómodo anteponer
uva un comando que activar manualmente un entornoLa gestión de versiones de Python también se vuelve más fácil, y da una sensación de batteries included por proyecto
Aún no sé qué tan estable será a largo plazo, pero ya lo uso por defecto en proyectos nuevos
Hay gente a la que no le gusta que uv detecte el entorno automáticamente
No veo tan claro el valor de gestionar versiones de Python, pero recrear entornos con uv sí es mucho más rápido
uv, puedes ejecutar comandos de forma stateless, lo que facilita la colaboraciónuvsigue siendo útil.venvy listoEste post del blog coincide casi por completo con mi experiencia
Hay menos fricción y todo es más simple
Ojalá la comunidad de Python adoptara uv como herramienta predeterminada
Las herramientas basadas en Rust cambiaron por completo la velocidad del feedback
Eso sí, me pregunto cómo gana dinero Astral. Recibió inversión, pero no tiene productos de pago
Por ejemplo, un registro de paquetes interno
Entrevista relacionada: entrevista con Charlie Marsh
Si hay 10 millones de desarrolladores de Python, uv también debería ser perfectamente monetizable
Personalmente, creo que las anotaciones de tipos y la eliminación del GIL son más importantes que uv
uv todavía está en una etapa temprana y también tiene incomodidades. Al final no deja de ser otro gestor de paquetes
El nuevo resolver de pip y el aumento en la distribución de wheels jugaron un papel importante
Artículo relacionado: Wheels are faster for pure Python
También es interesante que esté escrito en Rust. Tiene una estructura que soporta otros lenguajes, como LLVM
Desde la perspectiva del usuario final, uv es mucho mejor, y si resulta incómodo para quienes lo mantienen, entonces deberían dar feedback
Si apareciera un modo estricto, quizá también podría mejorar el rendimiento, aunque eso chocaría con la filosofía del lenguaje
Aun así, si conda desapareciera, estaría dispuesto a cambiarme a uv
A mí no me gusta uv
uv pip, así que tampoco es un reemplazo completoPero pip y venv también se rompen seguido y son más difíciles de depurar
uv no reemplaza a ruff
Y ni siquiera hace falta tocar las variables de entorno
uv pipno llama a pip, sino que ofrece una interfaz compatibleEn la práctica, uv sí reemplaza a pip
Me pregunto a qué problemas concretos de compatibilidad con Docker se refieren
uv add,uv syncyuv run, resulta mucho más ergonómico y rápidoPara más detalles, ver la documentación conceptual de dependencias de uv
Está bueno que
uvsea rápido, pero también me hace pensar en cómo habría sido si hubieran ido por el camino de mejorarpip.Lo estoy usando mucho en ML y Web, y espero que
uvpronto se vuelva una tecnología aburrida jajaCuando veo un repo que solo tiene
requirementsy nopyproject.toml, ya me parece anticuado jaja;