uv, el rapidísimo gestor de paquetes y proyectos de Python escrito en Rust
(github.com/astral-sh)- uv es un gestor de paquetes y proyectos de Python escrito en Rust, orientado a ser una herramienta única que reemplace a
pip,pip-tools,pipx,poetry,pyenv,twine,virtualenvy más - Ofrece un rendimiento 10 a 100 veces más rápido que
pip, y permite obtener esa mejora de velocidad con la interfazuv pipsin cambiar demasiado los flujos de trabajo existentes - Admite gestión de dependencias y entornos de proyecto, lockfile universal, workspaces estilo Cargo y deduplicación de dependencias basada en caché global
- Proporciona metadatos de dependencias en línea para scripts de un solo archivo, instalación y cambio de versión de Python, y ejecución e instalación de herramientas CLI distribuidas como paquetes de Python
- Funciona en macOS, Linux y Windows, puede instalarse con
curlopipsin necesidad de Rust ni Python, y en la instalación standalone puede actualizarse a sí mismo conuv self update
Alcance de lo que uv busca resolver
- uv es un gestor de paquetes y proyectos de Python escrito en Rust
- Su objetivo es reemplazar múltiples herramientas del ecosistema Python con una sola herramienta
pippip-toolspipxpoetrypyenvtwinevirtualenv
- Según BENCHMARKS.md, es 10 a 100 veces más rápido que
pip - uv cuenta con el respaldo de Astral, creadores de Ruff y ty
Funciones principales
-
Gestión de proyectos
- Gestiona dependencias y entornos, y admite lockfile y workspaces
- Permite inicializar proyectos, agregar dependencias y ejecutarlos de forma similar a
ryeopoetry - Ofrece un lockfile universal
- Admite workspaces estilo Cargo para manejar configuraciones de proyecto escalables
-
Ejecución de scripts
- Gestiona dependencias y entornos para scripts de un solo archivo
- Admite metadatos de dependencias en línea
- Permite ejecutar scripts en entornos virtuales aislados, como
uv run example.py
-
Ejecución e instalación de herramientas
- Ejecuta o instala herramientas CLI ofrecidas como paquetes de Python
uvxes un alias deuv tool runy ejecuta herramientas en entornos temporales- Se pueden instalar herramientas con
uv tool install ruff
-
Gestión de versiones de Python
- Permite instalar versiones de Python y cambiar entre ellas rápidamente
- Se pueden instalar varias versiones con
uv python install 3.12 3.13 3.14 - Se puede fijar la versión de Python a usar en el directorio actual con
uv python pin 3.11
Interfaz compatible con pip
- uv ofrece una interfaz compatible que reemplaza comandos habituales de
pip,pip-toolsyvirtualenv - Con la interfaz
uv pip, se puede experimentar una mejora de velocidad de 10 a 100 veces frente apipsin cambiar el flujo de trabajo existente - También incluye funciones extendidas
- override de versiones de dependencias
- resolución independiente de la plataforma
- resolución reproducible
- estrategias alternativas de resolución
- Flujo de trabajo de ejemplo
uv pip compile requirements.in --universal --output-file requirements.txtgenera un archivo requirements independiente de la plataformauv venvcrea un entorno virtualuv pip sync requirements.txtinstala los requirements fijados
Instalación y documentación
- Puede instalarse con el instalador standalone
- macOS y Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh - Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- macOS y Linux:
- También puede instalarse desde PyPI
pip install uvpipx install uv
- Si se instaló con el instalador standalone, puede autoactualizarse a la versión más reciente con
uv self update - La documentación está en docs.astral.sh/uv, y la referencia de línea de comandos puede verse con
uv help
Base de implementación y licencia
- El resolvedor de dependencias de uv usa internamente PubGrub
- La implementación de Git está basada en Cargo
- Algunas optimizaciones están inspiradas en el trabajo de pnpm, Orogene y Bun
- Para el soporte de Windows, aprovecha lo aprendido del Posy de Nathaniel J. Smith y utiliza trampoline
- La licencia es dual, a elección entre Apache License 2.0 o MIT license
1 comentarios
Opiniones de Hacker News
Hace apenas unos meses decía que jamás usaría
uv, y como ya estaba acostumbrado avenvypip, pensaba que no necesitaba una herramienta nueva.Ahora uso uv para todo mi trabajo en Python. El punto de inflexión fue un servidor compartido sin permisos de root, con muchos paquetes y drivers rotos; necesitaba
pytorchy nada funcionaba bien.piptardaba demasiado, la caché depipocupaba demasiado en el almacenamiento por usuario de 10 GB, y tampoco era fácil cambiar su ubicación. Al pasarme auv, simplemente todo funcionó.Si todavía te estás resistiendo, creo que de verdad no te vas a arrepentir si lo pruebas solo 5 minutos.
uves mucho más fácil tanto de explicar como de usar. Es especialmente bueno para quienes no trabajan con Python todos los días y solo escriben scripts de vez en cuando.La combinación de
pip+ archivos de configuración +venvexige recordar más o menos dos pasos para usar el entorno virtual correcto. Hay que crearlo, instalar dentro de él y, cada vez que ejecutas pruebas o scripts, recordar algún formato extraño de shebang o activar el entorno virtual. Los mensajes de error tampoco ayudan mucho, y creo que no puede ser de otra forma porque esta configuración no está estandarizada ni oficialmente bendecida. Al final, tienes que grabarte a la fuerza en la cabeza la relación entreImportErroryvenv.Se puede usar, pero al enseñárselo a gente que no está acostumbrada volví a sentir lo enredada que está toda la cadena de herramientas.
Ahora los miembros del equipo solo tienen que recordar
uv run,uv addyuv sync, y se siente mucho más fácil y menos intimidante.uves que sigue siendo compatible con los flujos de trabajo existentes basados en venv. Basta con ejecutaruv venv.ASDFdurante un tiempo y luego me pasé amise; me da curiosidad cómo se compara con mise, una herramienta moderna más generalista.uvfue la experiencia con Ruff. Ruff dice que puede “reemplazar por completo a Flake8, isort y Black”, pero no era cierto.Al menos en el caso de
isort, Ruff reimplementó solo las partes que quiso, y si faltan funciones o configuraciones, te dice que llames a la herramienta antiguaisortdesde Ruff. Si es así, no entiendo cuál es el punto. Ruff terminó siendo una reimplementación parcial de varias herramientas existentes, con funciones nuevas agregadas, así que en la práctica aumenta otra vez la cantidad de herramientas que hay que usar, y tampoco hace todo lo que hacePylint.Sobre pasarme a
uv, tampoco he escuchado una explicación convincente de sus ventajas frente a Poetry aparte de que “es rápido”. La única ventaja distintiva que conozco ahora es queuvpuede instalar Python en sí, así que puede eliminar herramientas comoPyenv. Eso es interesante, pero “es rápido” no me parece razón suficiente.pipocupaba mucho almacenamiento y no se podía mover bien, y que eso se resolvió conuv. ¿Es mejor el uso de almacenamiento? Si es así, ¿es porque comparte bien lo que se puede compartir?La primera vez que usé
uv, estaba convencido de que había cometido algún error o escrito algo mal. Fue porque terminó muchísimo más rápido que cualquier cosa que hubiera hecho conpip.uvtarda hasta 200 ms en instalar un paquete, así que se nota una pequeña demora entre presionar Enter y que aparezca el siguiente prompt del shell.Poetry no tiene ese problema. Si te vas unos minutos a preparar un café, por lo general ya terminó.
uvyruffson buenos contraejemplos para quienes dicen “no reinventes la rueda”. No hay que hacerlo solo por hacer algo nuevo, pero cuando hay objetivos claros, a veces se puede crear un producto mejor por una diferencia de un orden de magnitud.Normalmente terminan fracasando al reinventar la rueda, o haciendo otra vez la misma rueda sin valor. Esa frase definitivamente no aplica a expertos.
Como advertencia para otros que también podrían encontrarse con esto: en sistemas muy limitados,
uvpuede abrir demasiadas descargas simultáneas, sobrecargarlos y provocar timeouts. Por ejemplo, una AWS T2.micro corriendo Windows.Se puede limitar con la variable de entorno
UV_CONCURRENT_DOWNLOADS. En mi caso tuve que ponerla en 1 o 2; con más que eso, daba timeout.Sé que es un caso extremo, pero creo que
uvaquí es demasiado agresivo. En lugar de abrir un hilo de descarga por módulo, debería mirar la velocidad total de transferencia de cada servidor de origen y ajustar automáticamente la cantidad de hilos por servidor.uvpuede hacer que incluso un desktop Linux bastante potente se quede sin descriptores de archivo. Las instalaciones deterministas y reproducibles todavía tampoco funcionan. Necesita madurar más.Me gusta mucho
uv add --script mycoolscript.pyY si le agregas
#!/usr/bin/env -S uv runarriba, puedes ejecutar scripts de Python fácilmente, lo cual está genialAunque la fecha de corte de entrenamiento de Claude 4 es marzo de 2025, y acabo de comprobar que Claude Sonnet 4 pudo hacerlo sin instrucciones adicionales
Le pedí crear un script de Python que use
uvy dependencias inline de script; al darle una URL, la scrapea conhttpxybeautifulsoupy devuelve en CSV todas las URL de enlaces de la página y sus textosEl resultado está aquí, y también manejó bien las dependencias: https://claude.ai/share/57d5c886-d5d3-4a9b-901f-27a3667a8581
Con solo tener
uvinstalado como requisito mínimo, se convierte en una app reproducible y reactiva al instante que puedes enviarle a otras personas. Es una combinación realmente potentehttps://everything.intellectronica.net/p/the-little-scripter
https://www.youtube.com/watch?v=8LB7e2tKWoI
https://github.com/intellectronica/ez-mcp
uv adden el contexto de un proyecto conuv add --script, así que pueden ignorarlo~~Eso modifica el proyecto/entorno del directorio de trabajo actual. Está bastante cubierto en la documentación, pero creo que te gustará más
run --witho el soporte de PEP723 enuv~~https://docs.astral.sh/uv/guides/scripts/
mydependencies? ¿Un archivo de configuración?Empecé a usarlo hace poco en mi laptop para cosas personales. Si estás acostumbrado a
pip, es confusamente rápido. Varias veces pensé que algo había salido mal porque volvía demasiado rápidoProbé
uvhace un tiempo y me sorprendió lo rápido y fácil de usar que es. A estas alturas prácticamente no hay razón para usarpip, y si solo usas Python, casi tampoco hay razón para usar condapyenvypoetryUV es muy bueno
Ruff, del equipo de Astral, también es bueno. Nosotros acabamos de pasar el linting y el formateo de
pylint+ Black a RuffEl tiempo de lint bajó de 90 segundos a menos de 1.5 segundos; es una locura
pylint. Incluso pueden pasar fácilmente errores muy obvios, como código que ni siquiera se ejecuta por errores evidentesSi buscas ejemplos de uso de
uvcon Docker, preparé apps de ejemplo con Flask y Django: https://github.com/nickjj/docker-flask-example y https://github.com/nickjj/docker-django-exampleTambién hice optimizaciones como impedir que
uvcree un entorno virtual y compilar el bytecode una vez al instalar dependenciasValió totalmente la pena migrar. La velocidad de instalación mejoró cerca de 10 veces frente a
pip, y la instalación completa de dependencias bajó de 30 a 3 segundos. También es bueno tener soporte real para archivos de bloqueo. Por casualidad, hace aproximadamente una semana hice un artículo y un video sobre cambiar depipauven apps Flask/Django dockerizadas: https://nickjanetakis.com/blog/switching-pip-to-uv-in-a-dock...Hoy en día esta es mi forma favorita de ejecutar scripts pequeños
#!/usr/bin/env -S uv --quiet run --script# /// script# requires-python = ">=3.13"# dependencies = [# "python-dateutil",# ]# ///## [script de Python que necesita dateutil]#!/usr/bin/env uvx. Cada vez que la uso tengo que buscarla