Qu'est-ce que uv en Python ?

uv Python : qu'est-ce que c'est et comment l'utiliser ?

Publié le par Gabriel Trouvé (mis à jour le )

45 minutes

Vous connaissez certainement la routine par cœur : on installe Python, on crée un environnement virtuel avec python -m venv venv, on l'active, on lance pip install, et pour jongler entre les différentes versions de Python, on ajoute pyenv par-dessus (que je trouve d'ailleurs très pratique).

C'est ce que j'ai toujours fait. Quand je suis passé à uv, j'étais un peu perdu au début tellement j'avais mes habitudes ancrées. D'ailleurs, uv est déjà énormément adopté dans l'écosystème Python. Voyons ensemble pourquoi, et surtout comment l'utiliser.

Qu'est-ce que uv ?

uv est un gestionnaire de paquets et de projets Python, écrit en Rust par Astral, la même équipe derrière le linter ruff. Son objectif est de remplacer à lui seul toute une panoplie d'outils : pip, venv, virtualenv, pyenv, pipx et même poetry avec un seul exécutable.

Son principal argument, c'est sa vitesse : 10 à 100 fois plus rapide que pip. Une installation de dépendances est quasiment instantanée.

Pour vous donner une idée de l'engouement : uv dépasse les 126 millions de téléchargements mensuels en mars 2026. Ce même mois, OpenAI a carrément racheté Astral.

De pip + venv à uv

C'est LA partie la plus importante. Le déclic se fait quand on comprend que uv s'occupe de l'environnement virtuel à votre place. Reprenons un workflow « habituel » :

# 1. On crée un environnement virtuel
python -m venv venv

# 2. On l'active (et il faut penser à le faire à chaque fois !)
source venv/bin/activate

# 3. On installe nos paquets
pip install requests

# 4. On fige les versions à la main
pip freeze > requirements.txt

# 5. On lance enfin notre code
python main.py
SHELL

Avec uv, on ne crée plus d'environnement virtuel manuellement, on ne l'active plus et on ne fait plus de pip freeze. Tout ça est géré automatiquement en coulisses. Voici la correspondance directe :

Correspondance pip venv et uv

Correspondance pip venv et uv

Une fois ces commandes en tête, vous avez compris 80 % de uv.

À noter

Si vous utilisez aussi pyenv pour jongler entre plusieurs versions de Python, sachez que uv le remplace également : pyenv install 3.12 devient uv python install 3.12. On y revient juste après.

Installer uv

uv est autonome : il n'a pas besoin que Python soit installé au préalable pour fonctionner.

Sur macOS et Linux :

curl -LsSf https://astral.sh/uv/install.sh | sh
SHELL

Sur Windows (via PowerShell) :

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
POWERSHELL

À noter

Pour les utilisateurs de macOS, vous pouvez installer uv en passant par Homebrew via la commande brew install uv.

Vous trouverez les différentes façons d'installer uv sur cette page.

Une fois l'installation terminée, pour vérifier que tout fonctionne :

uv --version
SHELL

À noter

Comme uv est indépendant de Python, c'est lui qui se chargera ensuite de télécharger les versions de Python dont vous avez besoin. Et quand une nouvelle version de uv sort, un simple uv self update suffit à le mettre à jour. Et si vous êtes passé par Homebrew : brew update && brew upgrade.

Créer son premier projet

Pour créer un projet, une seule commande suffit :

uv init patrick
cd patrick
BASH

uv génère l'arborescence suivante :

.
├── .git/
├── .gitignore
├── .python-version
├── README.md
├── main.py
└── pyproject.toml
BASH

Le fichier main.py contient déjà un petit programme. Lançons-le :

uv run main.py
# Affiche : Hello from patrick!
SHELL

Il vient de se passer plusieurs choses. uv a créé l'environnement virtuel (.venv), installé les dépendances nécessaires, généré un fichier uv.lock et exécuté le code dans cet environnement.

Vous devez avoir :

.
├── .git/
├── .gitignore
├── .python-version
├── .venv/
├── README.md
├── main.py
├── pyproject.toml
└── uv.lock
SHELL

Regardons les fichiers importants :

  • pyproject.toml : le fichier standard de l'écosystème Python moderne. Il contient les métadonnées de votre projet

  • .python-version : il indique à uv quelle version de Python utiliser pour ce projet

  • .venv : votre environnement virtuel où sont installées les dépendances du projet

  • uv.lock : le fichier de verrouillage. Il liste les versions exactes de toutes vos dépendances

À noter

pyproject.toml et uv.lock gèrent tous les deux vos dépendances, mais pas au même niveau. pyproject.toml impose une contrainte large du type « ce projet a besoin d'au moins la version 2.32.4 de requests ». uv.lock fige la version exacte de requests réellement installée.

Gérer ses dépendances

Pour ajouter une dépendance, on utilise uv add. Pas besoin (ou plus besoin) d'activer quoi que ce soit :

uv add requests
SHELL

Cette commande met à jour trois fichiers : pyproject.toml, .venv et uv.lock. Il est aussi possible d'installer une version particulière :

uv add 'requests==2.31.0'
SHELL

Pour vos outils de développement (tests, linter, etc.), on les sépare des dépendances de production avec --dev :

uv add --dev pytest ruff
PYTHON

dev est un groupe de dépendances déjà reconnu par uv. pytest et ruff sont rangés dans une table à part de votre pyproject.toml :

[project]
name = "patrick"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.8"
dependencies = [
    "requests>=2.32.4",
]

[dependency-groups]
dev = [
    "pytest>=8.3.5",
    "ruff>=0.15.20",
]
SHELL

uv run et uv sync installent toujours vos dépendances de production et le groupe dev. Pour obtenir uniquement l'environnement de production, sans pytest ni ruff, il faut explicitement demander à uv de l'exclure :

uv sync --no-dev
SHELL

Vous pourriez créer un groupe personnalisé avec un autre nom. Par exemple, si vous avez besoin de la dépendance sphinx pour votre documentation, mais que vous voulez créer un groupe dédié à cette dépendance :

uv add --group docs sphinx
SHELL

uv crée la clé docs dans le fichier pyproject.toml. Contrairement au groupe dev qui est installé automatiquement, un groupe personnalisé doit toujours être demandé explicitement.

Si vous souhaitez retirer une dépendance :

uv remove requests
SHELL

Une fois qu'une dépendance est verrouillée dans un uv.lock, uv utilisera cette version même si une version plus récente existe. Si une nouvelle version d'une dépendance paraît, vous pouvez la mettre à jour :

uv lock --upgrade-package requests
SHELL

Si vous migrez un ancien projet qui possède déjà un requirements.txt, uv sait le lire directement :

uv add -r requirements.txt
SHELL

Gérer les versions de Python

Vous pouvez directement gérer les versions de Python avec uv. Pour savoir quelles versions sont disponibles, vous pouvez les lister :

uv python list
SHELL
Liste des versions avec uv

Liste des versions avec uv

Vous remarquerez que les versions de Python installées apparaissent aussi dans cette liste 😎.

Pour installer une version :

uv python install 3.13.13
SHELL

Vous pouvez créer un projet directement avec une version précise :

uv init --python 3.12 mon-projet
SHELL

Si vous ne spécifiez pas de version, uv ne prend pas une version au hasard. Il va chercher à « découvrir » les versions selon ses propres règles que vous pouvez retrouver dans la documentation.

Dans un projet existant, vous pouvez même mettre à jour la version de Python utilisée via :

uv python pin 3.13.13
SHELL

Outils en ligne de commande

Des scripts qui embarquent leur environnement

Imaginez un petit script que vous voulez partager et qui dépend de la bibliothèque requests. Plutôt que d'imposer à votre collègue de créer un environnement et d'installer les dépendances, uv permet de déclarer ces dépendances directement dans le fichier.

Partons d'un script simple :

import requests


response = requests.get("https://example.com/")
print(response.text)
PYTHON

Vous spécifiez quelle(s) dépendance(s) est/sont nécessaire(s) :

uv add --script main.py requests
SHELL

Et voici l'état du script après la commande :

# /// script
# requires-python = ">=3.13"
# dependencies = [
#     "requests>=2.34.2",
# ]
# ///
import requests


response = requests.get("https://example.com/")
print(response.text)
PYTHON

Il ne reste plus qu'à lancer le script :

uv run main.py
SHELL

uv lit les métadonnées, crée un environnement dans le cache et exécute le tout. Il faut savoir que cet environnement n'est pas supprimé après coup : uv le garde en cache, dans un répertoire global accessible via uv cache dir. Si jamais vous voulez nettoyer le cache, il suffit d'exécuter la commande uv cache clean.

Lancer des outils sans installation globale

La commande uvx exécute un outil sans l'installer globalement sur votre machine. Prenons ruff pour exemple :

uvx ruff check .
SHELL

C'est le même comportement que celui que l'on a vu précédemment : le premier uvx ruff installe ruff dans un environnement mis en cache, et les appels suivants réutilisent directement cette version en cache, sans tout retélécharger.

Mais si vous voulez l'installer durablement comme outil global :

uv tool install ruff
SHELL

Vous n'avez plus besoin de passer par uv, vous pouvez lancer directement ruff check ..

En espérant que ce guide vous aura aidé, car il n'est effectivement pas évident de passer d'un outil à un autre, surtout quand ces derniers touchent à vos environnements de développement. Pour ma part, j'avoue être conquis par uv ☺️.

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.