Aller au contenu principal

Python : uv

· 6 minutes de lecture

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 pip qui reprend les commandes de pip et pip-tools, et la lecture des fichiers requirements.txt existants.
  • Gestion de projet : pyproject.toml standard, 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 --from=ghcr.io/astral-sh/uv:latest /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​

uvPoetry
ImplémentationRust, binaire autonomePython
Format de projetpyproject.toml standard ([project], [dependency-groups])pyproject.toml ([project] depuis la 2.0, [tool.poetry] avant)
Lock fileuv.lock, universel multiplateformepoetry.lock
Interface pip / requirements.txtoui (uv pip)export via extension
Installation de Pythonoui (uv python install)non
Outils globauxoui (uvx, uv tool)non
Publicationoui (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].

Pour aller plus loin​

Application / Projet lié​

Mis en pratique dans le projetDécembre 2023 → aujourd'huiStandards Python - Template CookiecutterExploration de uv comme alternative moderne et rapide à pip pour la gestion des dépendances du projet.PythonuvRuffpytestCookiecutterGitHub Actions
Mis en pratique dans le projet2023 → aujourd'huiBody AnalysisGestion des dépendances Python du backend FastAPI de l'application (SQLAlchemy, Pydantic, Alembic) avec uv.FastAPIReactPostgreSQLMinIODocker
Mis en pratique dans le projet2026 → aujourd'huiDolibarr Project DashboardInstallation des dépendances Python avec uv dans la première étape du build Docker en trois étapes qui produit l'image unique de l'application.FastAPIReactTypeScriptTailwindDocker