Python : uv
uv est un gestionnaire de paquets et de projets Python développé par Astral (également éditeur de Ruff). Écrit en Rust, il remplace dans un seul binaire pip, pip-tools, virtualenv, pipx, pyenv et une bonne partie de Poetry, avec des temps d'installation et de résolution de l'ordre de dix à cent fois inférieurs à ceux de pip selon les mesures de ses auteurs.
Pourquoi utiliser uv ?
- Rapidité : résolution parallèle, téléchargements concurrents, cache global dont les fichiers sont liés (liens physiques ou copie à l'écriture) dans les environnements plutôt que copiés. Recréer un environnement déjà présent dans le cache prend une fraction de seconde.
- Compatibilité : une interface
uv pipqui reprend les commandes de pip et pip-tools, et la lecture des fichiersrequirements.txtexistants. - Gestion de projet :
pyproject.tomlstandard, lock file multiplateforme, environnement virtuel synchronisé automatiquement. - Gestion des interpréteurs : installation de versions de Python sans passer par le gestionnaire de paquets du système.
- Sécurité : vérification des empreintes (
--require-hashes), lock file qui enregistre l'empreinte de chaque distribution.
Installation
# Installeur officiel (binaire autonome dans ~/.local/bin)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Ou via pipx, Homebrew
pipx install uv
brew install uv
# Mise à jour d'une installation par l'installeur officiel
uv self update
Interface compatible pip
L'interface uv pip reproduit les commandes de pip et pip-tools, ce qui permet d'accélérer un workflow existant sans le modifier :
# Créer un environnement virtuel dans .venv
uv venv
# Installer des paquets dans l'environnement (détecté automatiquement)
uv pip install requests fastapi
# Compiler un requirements.txt verrouillé à partir de requirements.in (équivalent de pip-compile)
uv pip compile requirements.in -o requirements.txt
# Aligner exactement l'environnement sur ce fichier : installe les manquants, retire le reste
uv pip sync requirements.txt
uv pip install refuse par défaut d'installer dans l'interpréteur du système en dehors d'un environnement virtuel ; l'option --system lève explicitement cette protection (dans une image Docker, par exemple).
Gestion de projet
Au-delà de l'interface pip, uv gère un projet complet à partir de pyproject.toml :
# Créer un projet (pyproject.toml, .python-version, README.md)
uv init mon-projet && cd mon-projet
# Ajouter des dépendances : met à jour pyproject.toml, uv.lock et .venv
uv add fastapi "sqlalchemy>=2.0"
uv add --dev pytest ruff
# Exécuter une commande dans l'environnement du projet, synchronisé au préalable
uv run pytest
uv run python -m mon_projet
# Recalculer le lock file sans installer
uv lock
# Installer exactement le contenu du lock file (CI, image Docker)
uv sync --locked
uv add écrit la dépendance dans la section standard [project] de pyproject.toml et les dépendances de développement dans [dependency-groups] (PEP 735) :
[project]
name = "mon-projet"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.115.0",
"sqlalchemy>=2.0",
]
[dependency-groups]
dev = [
"pytest>=8.3.0",
"ruff>=0.8.0",
]
Le fichier uv.lock est universel : il contient une résolution valable pour toutes les plateformes et versions de Python acceptées par requires-python, avec des marqueurs d'environnement lorsque les versions diffèrent. Un même lock file sert ainsi sur le poste macOS d'un développeur et dans une image Linux de production. uv run vérifie avant chaque exécution que uv.lock et .venv sont à jour par rapport à pyproject.toml, et les resynchronise si besoin : il n'y a pas d'environnement à activer manuellement.
uv sync --locked échoue si le lock file ne correspond plus à pyproject.toml, ce qui détecte en CI une dépendance ajoutée sans mise à jour du lock file.
Gestion des versions de Python
# Installer une ou plusieurs versions de Python (distributions autonomes)
uv python install 3.12 3.13
# Fixer la version utilisée par le projet (écrit .python-version)
uv python pin 3.12
# Lister les versions disponibles et installées
uv python list
Si la version demandée par le projet n'est pas présente sur la machine, uv run et uv sync la téléchargent automatiquement. Cette fonction remplace pyenv, sans compilation locale de l'interpréteur.
Outils en ligne de commande
uvx (alias de uv tool run) exécute un outil Python dans un environnement temporaire mis en cache, sans l'installer dans le projet ; uv tool install l'installe de façon permanente dans un environnement isolé, comme pipx :
# Exécuter ruff ponctuellement
uvx ruff check .
# Installer un outil de façon permanente (commande disponible dans ~/.local/bin)
uv tool install pre-commit
Construction et publication
# Construire le wheel et l'archive source dans dist/
uv build
# Publier sur PyPI (jeton d'API, ou Trusted Publishing en CI)
uv publish
uv build appelle le build backend déclaré dans [build-system] (le backend natif uv_build, proposé par défaut par les versions récentes de uv init --package, ou hatchling, setuptools...) ; les mécanismes de construction et de publication sont détaillés dans l'article packaging Python.
uv dans une image Docker
FROM python:3.12-slim
COPY /uv /usr/local/bin/uv
WORKDIR /app
# Dépendances d'abord (couche mise en cache tant que le lock file ne change pas)
COPY pyproject.toml uv.lock ./
RUN uv sync --locked --no-dev --no-install-project
# Puis le code du projet
COPY . .
RUN uv sync --locked --no-dev
CMD ["uv", "run", "--no-sync", "python", "-m", "mon_projet"]
--no-install-project installe les seules dépendances, sans le projet lui-même, ce qui sépare les deux couches selon le principe décrit dans l'article Docker : bonnes pratiques. En production, l'étiquette latest de l'image uv gagne à être remplacée par une version précise.
uv vs Poetry
| uv | Poetry | |
|---|---|---|
| Implémentation | Rust, binaire autonome | Python |
| Format de projet | pyproject.toml standard ([project], [dependency-groups]) | pyproject.toml ([project] depuis la 2.0, [tool.poetry] avant) |
| Lock file | uv.lock, universel multiplateforme | poetry.lock |
| Interface pip / requirements.txt | oui (uv pip) | export via extension |
| Installation de Python | oui (uv python install) | non |
| Outils globaux | oui (uvx, uv tool) | non |
| Publication | oui (uv build, uv publish) | oui (poetry build, poetry publish) |
Les deux outils couvrent désormais un périmètre proche pour la gestion de projet. uv se distingue par sa vitesse, la gestion des interpréteurs et l'exécution d'outils ; Poetry par son antériorité et un écosystème d'extensions établi. La migration d'un projet Poetry 2 est facilitée par l'usage commun de la section [project].