La vida es muy corta para esperar por un pip install
Si llevas algunos años programando en Python, seguramente te has enfrentado al desafío de gestionar paquetes y dependencias. El ecosistema de Python ha estado desarrollando múltiples herramientas en los últimos años para encontrar una solución eficaz que permita gestionar paquetes de forma rápida y eficiente en proyectos diversos. Finalmente, parece que podríamos estar cerca de una respuesta: uv.
¿Qué es uv?
uv es el nuevo proyecto de Astral, una compañía dedicada a mejorar el tooling de Python, que también es responsable de Ruff , el nuevo estándar de linter y formateo de código en Python. Con uv, Astral busca ofrecer una solución end-to-end al estilo de Cargo: una herramienta única que permita ejecutar código, instalar dependencia y gestionar herramientas
¿Cómo instalar uv?
uv es un binario que puede instalarse de varias maneras. Si ya programas en Python, probablemente la forma más sencilla sea mediante pip simplemente: pip install uv. En la web oficial encontrarás una lista completa de métodos de instalación.
Remplazo de pip
La primera versión de uv se lanzó en febrero de 2024, y en ese momento, la herramienta era simplemente un reemplazo para pip y algunas herramientas relacionadas como pip-tools. La diferencia clave es la velocidad de instalación de paquetes. Según el equipo de Astral, la instalación de paquetes con uv es entre 10 y 100 veces más rápida en comparación con pip en la mayoría de los casos. En este video se puede apreciar la diferencia de velocidad instalando los mismo paquetes (la chache de pip y uv fueron borradas antes de la ejecución)
Las cifras reportadas por el equipo de Astral hablan de una mejora de entre 10 y 100 en la mayoría de los casos comparado con pip. Por ejemplo en el sitio oficial estos son los tiempos que reportan instalando Trio con una cache warm.
Para usar uv, sencillamente se pone como prefijo al comando usual de pip como se muestra en el siguiente ejemplo:
En agosto llego una actualización que añadió nuevas funcionalidades a la herramienta añadiendo funcionalidades para administrar virtualenvs, proyectos y más.
Instalar Python
uv nos permite instalar y gestionar versiones de python.
Crear Entornos Virtuales
Otra de las funcionalidades es crear entornos virtuales.
Ejecución de Scripts
Una de las funciones que incluye uv es ejecutar scripts directamente. Esto no es muy diferente de ejecutar el archivo directamente con python pero uv incluye varias funcionalidades que mejoran la experiencia. Primero, selecciona dinámicamente el entorno donde se ejecuta. Si está en un proyecto o hay un archivo .venv , ejecutará el script dentro de ese entorno virtual. En caso de no existir, creará un entorno virtual temporal para ejecutar el script. Por ejemplo, digamos que queremos ejecutar el siguiente script:1:
Para especificar las dependencias del entorno virtual temporal, podemos indicarlas directamente en la línea de comandos (CLI) como en el siguiente ejemplo:
También podemos utilizar la nueva especificación del PEP 723 para definir las dependencias en el propio script, como se muestra en el siguiente ejemplo:
Para ejecutar el script, simplemente elimina los parámetros “—with” y usa el siguiente comando:
Además, uv permite agregar dependencias a un script de forma interactiva usando:
uv add --script example.py 'requests<3' 'rich'
Así, podemos convertir la primera versión del archivo en la segunda.
Nuevas Bibliotecas, Nuevo Universo
Hasta ahora hemos visto como usar uv como un cli, pero también puede utilizarse como una biblioteca, lo que ha permitido que surjan bibliotecas adicionales que habilitan nuevos usos. Si bien estas funciones eran posibles antes, ahora son mucho más accesibles gracias a la velocidad y comodidad de uv. A continuación, exploraremos un par de bibliotecas que exploran estas nuevas posibilidades. Ambas están desarrolladas por koaning , un científico de datos y programador con muchos otros proyectos interesantes, algunos de los cuales han servido de ejemplo para esta sección.
UVNB
El Objetivo de este proyecto es brindar soporte de PEP 723 a los notebooks, permitiendo su uso de la misma forma que con scripts:
python -m uvnb run example.ipynb
De esta forma los notebooks se pueden volver un formato más sencillo de compartir.
uvTrick
Esta biblioteca permite ejecutar código en Python utilizando diferentes versiones de Python. Esto es útil para realizar benchmarks de diferentes versiones de bibliotecas o del propio lenguaje. Por ejemplo, en el siguiente ejemplo trataremos de ver si hay diferencias en la velocidad de la implementación de PCA dentro de la biblioteca sklearn:
Ejecutando este script, obtendremos lo siguiente:
En este ejemplo se ejecuta la misma función (bench) con 2 versiones diferentes de sklearn (1.4, 1.5) y podemos ver cómo la implementación de PCA en la versión 1.5 mejora significativamente el tiempo de ejecución.
Ejecutar Paquetes
En python muchos paquetes también proveen aplicaciones, como Ruff, Fastapi, Flask y muchos otros. Si queremos ejecutar estas aplicaciones sin tener la necesidad de instalarlas uv provee la funcionalidad uvx que nos permite ejecutar una aplicación en un virtualenv temporal sin tener que instalar nada como en el siguiente ejemplo:
Si necesitas instalar la aplicación en un entorno virtual aislado para uso recurrente, puedes usar la funcionalidad tools de uv. Por ejemplo si queremos instalar Ruff, sería algo asi:
Gestor de Proyectos
uv también cuenta con un gestor de proyecto al estilo de poetry. Además provee templates para apps y para bibliotecas. Por ejemplo para crear un template de una app se ejecuta:
Esto crea la carpeta con el nombre del proyecto y los ficheros relacionados con este como un .gitignore, un README.md y el archivo de configuración pyproject.toml que es donde van a vivir las configuraciones de nuestro proyecto.
Dentro de un proyecto para añadir dependencia se utiliza uv add. Por ejemplo para añadir una dependencia de desarrollo sería de la siguiente forma:
Al installar el paquete, uv creó automaticamente un entorno virtual y un uv.lock. El entorno virtual es el que se va usar para ejecutar el proyecto y el fichero que contiene las dependencias exactas del proyecto, este fichero nunca debería editarse a mano.
¿Es UV el futuro?
uv se perfila como una herramienta clave en el ecosistema Python, adoptada rápidamente por proyectos como FastApi y valorada por su notable mejora en velocidad y su enfoque unificado en la gestión de dependencias y proyectos. Al igual que su "hermano" Ruff, uv está revolucionando los flujos de trabajo al facilitar scripts con dependencias embebidas, eliminando la necesidad de largas instrucciones de instalación y configuración. Su creciente popularidad sugiere que no solo representa el futuro de Python, sino que debería integrarse en el presente de nuestros desarrollos para aprovechar al máximo sus innovadoras capacidades.
Extra
Una de las herramientas más usuales en el desarrollo es Docker y Astral ha hecho varios templates e imagenes base para facilitarnos la configuración de nuevos proyectos. También Actions de Github y otras herramientas de desarrollo, aqui hay una lista de las más relevantes:
Para ver el resto de los ejemplos puede ir a la página de Github de Astral.
También puedes ver y usar los slides de este artículo aqui.