4 puntos por GN⁺ 2025-06-24 | 1 comentarios | Compartir por WhatsApp
  • 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, virtualenv y más
  • Ofrece un rendimiento 10 a 100 veces más rápido que pip, y permite obtener esa mejora de velocidad con la interfaz uv pip sin 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 curl o pip sin necesidad de Rust ni Python, y en la instalación standalone puede actualizarse a sí mismo con uv 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
    • pip
    • pip-tools
    • pipx
    • poetry
    • pyenv
    • twine
    • virtualenv
  • 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 rye o poetry
    • 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
    • uvx es un alias de uv tool run y 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-tools y virtualenv
  • Con la interfaz uv pip, se puede experimentar una mejora de velocidad de 10 a 100 veces frente a pip sin 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.txt genera un archivo requirements independiente de la plataforma
    • uv venv crea un entorno virtual
    • uv pip sync requirements.txt instala los requirements fijados

Instalación y documentación

  • Puede instalarse con el instalador standalone
  • También puede instalarse desde PyPI
    • pip install uv
    • pipx 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

 
GN⁺ 2025-06-24
Opiniones de Hacker News
  • Hace apenas unos meses decía que jamás usaría uv, y como ya estaba acostumbrado a venv y pip, 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 pytorch y nada funcionaba bien. pip tardaba demasiado, la caché de pip ocupaba demasiado en el almacenamiento por usuario de 10 GB, y tampoco era fácil cambiar su ubicación. Al pasarme a uv, 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.

    • Para mí, la clave fue que uv es 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 + venv exige 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 entre ImportError y venv.
      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 add y uv sync, y se siente mucho más fácil y menos intimidante.
    • Para mí, la función decisiva de uv es que sigue siendo compatible con los flujos de trabajo existentes basados en venv. Basta con ejecutar uv venv.
    • Usé ASDF durante un tiempo y luego me pasé a mise; me da curiosidad cómo se compara con mise, una herramienta moderna más generalista.
    • Lo que me impidió pasarme a uv fue 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 antigua isort desde 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 hace Pylint.
      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 que uv puede instalar Python en sí, así que puede eliminar herramientas como Pyenv. Eso es interesante, pero “es rápido” no me parece razón suficiente.
    • Me da curiosidad la parte de que la caché de pip ocupaba mucho almacenamiento y no se podía mover bien, y que eso se resolvió con uv. ¿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 con pip.

    • A veces uv tarda 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ó.
    • A mí me pasó igual. Es tan fluido que no parece Python.
    • Me pasó exactamente lo mismo la semana pasada, y estaba convencido de que no estaba funcionando bien. Ahora ya me convertí.
  • uv y ruff son 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.

    • Creo que esa frase suele dirigirse a artesanos inmaduros que no saben cómo funciona el sistema actual, cuáles son sus defectos ni cómo mejorarlo. Algo como un estudiante de licenciatura intentando resolver la conjetura de Goldbach.
      Normalmente terminan fracasando al reinventar la rueda, o haciendo otra vez la misma rueda sin valor. Esa frase definitivamente no aplica a expertos.
    • Más que reinventar la rueda, es como cambiar la madera por un material más resistente para que aguante una rotación 10 veces más rápida.
    • Si miras la historia de la gestión de paquetes de Python, queda claro que todos piensan que pueden hacerlo mejor que el estado actual.
    • La frase “no reinventes la rueda” sinceramente no tiene ningún sentido. Todavía no usamos discos de madera como ruedas; desde el Neolítico hemos inventado ruedas mucho mejores. No hay razón para no hacer lo mismo en software.
    • Ruff, de hecho, es un buen ejemplo de los riesgos de reescribir. Rehízo las herramientas, pero no rehízo todas las partes de esas herramientas.
  • Como advertencia para otros que también podrían encontrarse con esto: en sistemas muy limitados, uv puede 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 uv aquí 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.

    • No es nada extremo. Mucha gente usa el VPS más barato y pequeño para proyectos hobby, y yo también hago eso, aunque no en AWS. Gracias por compartirlo; ojalá mejore la detección automática.
    • En proyectos grandes, uv puede 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.py
    Y si le agregas #!/usr/bin/env -S uv run arriba, puedes ejecutar scripts de Python fácilmente, lo cual está genial

    • Creé un Claude Project con instrucciones especiales que enseñan solo este método, y así con un solo prompt te devuelve un script completo con dependencias inline: https://simonwillison.net/2024/Dec/19/one-shot-python-tools/
      Aunque 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 uv y dependencias inline de script; al darle una URL, la scrapea con httpx y beautifulsoup y devuelve en CSV todas las URL de enlaces de la página y sus textos
      El resultado está aquí, y también manejó bien las dependencias: https://claude.ai/share/57d5c886-d5d3-4a9b-901f-27a3667a8581
    • Estoy usando este truco en el modo app de los notebooks de Marimo.io
      Con solo tener uv instalado 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 potente
    • Es buenísimo. Ahora ya es costumbre hacer vibe coding de scripts pequeños y ejecutarlos de inmediato. Es mucho mejor que tener que gestionar entornos y dependencias
      https://everything.intellectronica.net/p/the-little-scripter
      https://www.youtube.com/watch?v=8LB7e2tKWoI
      https://github.com/intellectronica/ez-mcp
    • Leí mal el ejemplo. Lo de abajo es irrelevante, porque confundí por patrón uv add en el contexto de un proyecto con uv 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 --with o el soporte de PEP723 en uv~~
      https://docs.astral.sh/uv/guides/scripts/
    • ¿Qué es 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ápido

  • Probé uv hace 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 usar pip, y si solo usas Python, casi tampoco hay razón para usar conda

    • Parece que también permite dejar de usar pyenv y poetry
  • UV 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 Ruff
    El tiempo de lint bajó de 90 segundos a menos de 1.5 segundos; es una locura

    • Llegará el momento en que te des cuenta de que Ruff solo realiza una parte de las comprobaciones de pylint. Incluso pueden pasar fácilmente errores muy obvios, como código que ni siquiera se ejecuta por errores evidentes
  • Si buscas ejemplos de uso de uv con Docker, preparé apps de ejemplo con Flask y Django: https://github.com/nickjj/docker-flask-example y https://github.com/nickjj/docker-django-example
    También hice optimizaciones como impedir que uv cree un entorno virtual y compilar el bytecode una vez al instalar dependencias
    Valió 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 de pip a uv en 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]

    • Ojalá la línea shebang fuera mucho, mucho más fácil de recordar, como #!/usr/bin/env uvx. Cada vez que la uso tengo que buscarla