- Al cambiar a uv, la velocidad de instalación de dependencias de Python es aproximadamente 10 veces más rápida que con pip, y también permite ejecutarlas como usuario no root sin usar un
venv aparte
- Con base en
pyproject.toml, basta con declarar solo las dependencias de nivel superior y uv administra automáticamente el archivo lock, ofreciendo un árbol de dependencias y un control exacto de versiones superior a pip freeze
- En el Dockerfile se requieren cambios paso a paso, como copiar los binarios de uv y uvx, usar los archivos
pyproject.toml/uv.lock y configurar variables de entorno
- Con comandos como
uv sync/add/remove, uv:outdated es posible gestionar fácilmente la adición, eliminación y actualización de dependencias, además de revisar versiones más recientes de los paquetes
- Facilita la administración periódica del archivo lock y la actualización de dependencias, lo que aporta consistencia en entornos de colaboración y despliegue
Instalación de dependencias 10 veces más rápida, sin venv y en un entorno no root
- uv es una herramienta que mejora de forma importante la velocidad de instalación de dependencias en proyectos Python frente a pip
- Con la adopción de uv, en proyectos como Flask o Django se puede experimentar una velocidad de instalación cerca de 10 veces mayor que con pip
- Incluso sin un entorno virtual (
venv) separado, es posible ejecutar de forma segura dentro del contenedor como usuario no root
pyproject.toml vs requirements.txt
- En lugar del tradicional
requirements.txt, si se declaran solo las dependencias de nivel superior en el archivo pyproject.toml, uv genera automáticamente el archivo uv.lock
- Agregar la entrada
[project] dependencies en pyproject.toml
- Eliminar el
requirements.txt existente
- El archivo lock de uv es similar al resultado de
pip freeze, pero incluye un árbol de dependencias y datos de versión más precisos
Cambios en la configuración del Dockerfile
- Se usan los binarios de uv y uvx copiándolos al contenedor (binarios de Rust compilados estáticamente)
- En lugar de
requirements*.txt, se copian los archivos pyproject.toml, uv.lock\*
- Agregar variables de entorno:
UV_COMPILE_BYTECODE=1: precompila a bytecode en la etapa de build
UV_PROJECT_ENVIRONMENT="/home/python/.local": instala los paquetes en una ruta específica sin crear un venv aparte
- El comando de instalación de dependencias también cambia de
pip3-install a uv-install
- Ejemplo:
RUN chmod 0755 bin/* && bin/uv-install
Gestión de dependencias: agregar, quitar, actualizar, etc.
- Se pueden ejecutar comandos de uv dentro del contenedor mediante un script
run independiente
./run deps:install: instala después de construir la imagen y exporta el archivo lock al host
./run deps:install --no-build: actualiza solo el archivo lock sin hacer build
./run uv add mypackage --no-sync: actualiza solo pyproject.toml y el archivo lock; la instalación real se ejecuta por separado
./run uv remove mypackage --no-sync: elimina un paquete
./run uv:outdated: revisa la versión más reciente de las dependencias actuales
Video y guía práctica disponibles
- Incluye demo real y ejemplos de
git diff sobre la adopción de uv, redacción de pyproject.toml, cambios en el Dockerfile, comandos de lock/sync, agregar o quitar dependencias y revisar versiones más recientes
- También se pueden consultar los diff de migración de dos proyectos: Flask y Django
2 comentarios
Justo estaba pensando en migrar lo que desplegaba con Poetry, y esto se ve estable y sencillo ^^
Opiniones en Hacker News
Vale la pena notar que uv soporta un flujo de trabajo que reemplaza directamente a pyenv, virtualenv y pip. No es un enfoque forzado por un lockfile o por
pyproject.toml. Con el comandouv python pin <version>se crea un archivo.python-versionen el directorio actual, conuv virtualenvse descarga esa versión de Python como en pyenv y se crea el entorno virtual.venv, conuv pip install -r requirements.txtse instalan los paquetes derequirements.txt, y conuv run <command>se puede ejecutar un comando incluyendo las variables de entorno del archivo.env. Eso sí, hay que tener cuidado con el orden de prioridad de las variables de entorno (issue relacionado)uv pipse pone lento y no tengo claro por qué; quizá tenga que ver con la red de la empresa.python-versionrealmente es necesario, porque entiendo que la información de la versión de Python también se guarda enpyproject.tomlEste enfoque le quita sentido a la existencia misma del lock file. Si el archivo no existe o es inválido, eso significa que hay un problema serio con el lock file y lo ideal es que alguien familiarizado con el proyecto lo resuelva manualmente. Si no, entonces no tiene mucho caso tener lock file. En CI podría reemplazarse automáticamente el lock file y generar confusión
uv lockfalla con un mensaje claro, y porerrexiten el script de shell todo se detiene de inmediato. La redirección de errores enuv lock --checkes para evitar que el mismo error se imprima dos veces. Si se rompe el lock file a propósito y se ejecuta el script, el build se detiene con un mensaje de error específico. Reescribí el script conif-elsepara que quede más claro. Si no hay lock file, sí corresponde crearlo. En ese caso se genera y luego se hace commituv sync --locked. Si no hay lock file o está desactualizado, falla de forma clara. Recomiendo hacer siempre los builds con la opción--locked--frozen, se supone que el lock file no debe actualizarse, pero en la práctica pasa lo contrario. Coincido en que si falta el lock file o no coincide, tiene que intervenir una personaEstoy totalmente en contra de que las herramientas de Python se desarrollen en lenguajes que no sean Python. Ya existe C y CPython está estandarizado, así que no hace falta un lenguaje nuevo como Rust. El paquete Pendulum tardó más de 7 meses en soportar 3.13, y creo que fue porque al tener código nativo en Rust faltaba gente capaz de arreglar ese problema. Si hubiera sido C, yo mismo lo habría corregido. (issue relacionado) En un mundo ideal, si quieres hacer un datetime rápido con un lenguaje externo como Rust, lo correcto sería hacerlo vía FFI en un formato reutilizable por varios lenguajes. Todavía no me convence mucho el enfoque basado en Rust, y ya entiendo por qué a la comunidad Linux no le gusta
Hay que tener cuidado al usar uv en lugar de pip. Por defecto no genera archivos
.pyc, así que el inicio del servicio podría volverse más lento (referencia)Si pruebas uv en un contenedor de Flask, no solo la diferencia en tiempo de build es lo bastante grande como para hacerse tediosa con pip, sino que además el proceso de instalación se vuelve muy predecible. Se acabó esa frustración de que cambien las versiones de dependencias con pip. Usas
pyproject.toml, ejecutasuv locky listo. En Docker, si copias solopyproject.tomlyuv.lock(HOT COPY) y ejecutasuv sync --frozen --no-install-project, puedes cachear la capa de instalación omitiendo el código de la app. Si sabes lo doloroso que es reconstruir toda la capa por cambiar un solo paquete, entiendes por qué esto importa. Si usas la variableUV_PROJECT_ENVIRONMENT=/home/python/.local, puedes pre-warm la imagen base sinvenv, compartir builds y reducir costos de infraestructura. Con la opciónUV_COMPILE_BYTECODE=1se generan archivos.pycdurante el build. Se eliminan los entornos mutables y se fuerza la reproducibilidad; si ahora un build falla, queda claro que el problema es del lockfileIncluso en 2025, el empaquetado y la gestión de dependencias en Python siguen siendo un caos
requirements.txtyvenvme bastaMe da curiosidad comparar la seguridad de gestores de paquetes de Python como uv, pip y conda. La velocidad está bien, pero la seguridad del package manager me parece mucho más importante
Como alguien que publica paquetes en PyPI, personalmente me gustaría usar uv por su rapidez, pero no puedo cambiar tan fácilmente si no hay garantía de que se comporte exactamente igual que pip. Si un usuario tiene un error con
pip install xxx, yo también necesito reproducirlo y depurarlo en el mismo entornoCreo que uv es uno de los cambios más positivos que ha habido recientemente en el empaquetado de Python: simplemente lo ejecutas y te da un buen resultado
También se comparte una excelente guía para usar uv en la construcción de contenedores de producción (ver guía)