Tu as dĂ©jĂ  créé un requirements.txt Ă  la main, un virtualenv avec python -m venv, puis rĂ©alisĂ© que ton collĂšgue n’arrive pas Ă  reproduire ton environnement ? La gestion des dĂ©pendances Python a longtemps Ă©tĂ© le point faible de l’Ă©cosystĂšme. Poetry est venu rĂ©gler ce problĂšme une bonne fois pour toutes.

Dans cet article, tu vas dĂ©couvrir pourquoi Poetry est devenu un standard de la gestion de projet Python moderne : dĂ©pendances dĂ©clarĂ©es proprement, environnement virtuel gĂ©rĂ© automatiquement, versions verrouillĂ©es pour une reproductibilitĂ© parfaite, et packaging prĂȘt pour la publication. Tu repartiras avec un workflow complet, directement applicable Ă  tes projets.

Le problĂšme : la gestion de projet Python Ă  l’ancienne

Avant Poetry, le workflow typique ressemblait à ça :

  • Un requirements.txt oĂč l’on Ă©pinglait les versions Ă  la main
 ou pas
  • La crĂ©ation manuelle d’un virtualenv (python -m venv .venv), qu’il fallait activer Ă  chaque session
  • Des conflits de versions dĂšs que deux projets utilisaient des versions diffĂ©rentes de la mĂȘme bibliothĂšque
  • Un passage pĂ©nible de « ça marche chez moi » Ă  « ça marche en CI »

Ce fonctionnement a plusieurs dĂ©fauts. Le requirements.txt ne distingue pas les dĂ©pendances d’exĂ©cution des dĂ©pendances de dĂ©veloppement (test, lint, documentation). Les versions ne sont pas systĂ©matiquement verrouillĂ©es, donc deux installations du mĂȘme fichier peuvent produire deux environnements diffĂ©rents. Et rien ne t’aide Ă  empaqueter ton code pour le distribuer.

Qu’est-ce que Poetry ?

Poetry est un gestionnaire de dĂ©pendances et d’empaquetage pour Python. Il centralise tout dans un fichier unique, pyproject.toml, et s’occupe de :

  • DĂ©clarer les dĂ©pendances dans un format standardisĂ© et lisible
  • CrĂ©er et gĂ©rer l’environnement virtuel automatiquement — tu n’as plus jamais Ă  l’activer Ă  la main
  • Verrouiller les versions dans un fichier poetry.lock pour une reproductibilitĂ© exacte
  • Empaqueter et publier ton projet sur PyPI en quelques commandes

L’idĂ©e centrale de Poetry : un projet Python doit ĂȘtre aussi simple Ă  gĂ©rer qu’un projet Node.js avec npm ou un projet Rust avec Cargo. Et c’est exactement ce qu’il apporte : un fichier de configuration unique, une commande pour ajouter une dĂ©pendance, une commande pour tout installer.

Installer Poetry

L’installation recommandĂ©e se fait via le script officiel, qui installe Poetry dans un environnement isolĂ© (il ne pollue pas ton Python systĂšme) :

curl -sSL https://install.python-poetry.org | python3 -

À l’issue de l’installation, ajoute le rĂ©pertoire d’installation Ă  ton PATH (le script t’indique le chemin exact selon ton systĂšme). VĂ©rifie que tout fonctionne :

poetry --version

Tu peux aussi installer Poetry avec pipx, si tu l’utilises dĂ©jĂ  pour tes outils en ligne de commande :

pipx install poetry

Dans les deux cas, Poetry vit dans son propre environnement : tes projets restent propres, et les mises à jour de Poetry ne cassent jamais tes dépendances.

Créer son premier projet

Pour un nouveau projet, Poetry gĂ©nĂšre la structure complĂšte — dossier de code, tests, configuration :

poetry new mon-projet
cd mon-projet

Tu obtiens une arborescence propre et prĂȘte Ă  l’emploi :

mon-projet/
├── mon_projet/
│   └── __init__.py
├── tests/
│   └── test_mon_projet.py
├── pyproject.toml
├── README.md
└── .gitignore

Pour un projet existant, poetry init te pose quelques questions (nom, version, licence, dépendances) et génÚre le pyproject.toml sans toucher à ton code :

cd mon-projet-existant
poetry init

Le fichier pyproject.toml, le cƓur du projet

Tout est déclaré dans pyproject.toml, un format standardisé par la communauté Python (PEP 518). Voici à quoi ressemble un fichier typique :

[tool.poetry]
name = "mon-projet"
version = "0.1.0"
description = "Un projet Python moderne"
authors = ["Ton Nom <ton@email.com>"]

[tool.poetry.dependencies]
python = "^3.11"
requests = "^2.32.0"

[tool.poetry.group.dev.dependencies]
pytest = "^8.0.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Deux sections sont essentielles :

  • [tool.poetry.dependencies] : les dĂ©pendances d’exĂ©cution, avec une contrainte de version lisible (^2.32.0 signifie « compatible avec 2.32.0, jusqu’Ă  la prochaine version majeure »)
  • [tool.poetry.group.dev.dependencies] : les dĂ©pendances de dĂ©veloppement, installĂ©es seulement quand c’est nĂ©cessaire

Fini les requirements.txt séparés et les fichiers de contraintes incompréhensibles : tout tient dans un seul fichier, versionnable et reviewable en pull request.

L’environnement virtuel gĂ©rĂ© pour toi

C’est l’un des plus grands conforts de Poetry : tu n’as plus jamais besoin de crĂ©er ou d’activer un virtualenv Ă  la main. Quand tu exĂ©cutes une commande Poetry, il crĂ©e automatiquement un environnement virtuel isolĂ© pour ton projet s’il n’existe pas encore :

poetry install

Cette commande crĂ©e l’environnement, rĂ©sout les dĂ©pendances, puis installe tout (y compris ton propre package en mode dĂ©veloppement, ce qui est pratique pour les tests). Tu peux vĂ©rifier oĂč vit ton environnement :

poetry env info

Pour exĂ©cuter une commande dans l’environnement du projet, deux options :

  • poetry run python main.py — exĂ©cute une commande ponctuelle dans le bon environnement
  • poetry shell — active l’environnement dans ton terminal pour une session de travail

Personnellement, je recommande poetry run : c’est explicite, ça marche partout (y compris dans les scripts et la CI) et ça Ă©vite les erreurs du type « j’ai oubliĂ© d’activer mon venv ».

Ajouter des dépendances

Ajouter une bibliothĂšque Ă  ton projet se fait en une commande :

poetry add requests

Poetry résout le graphe de dépendances complet (les dépendances des dépendances), choisit une version compatible, met à jour pyproject.toml et poetry.lock, puis installe la bibliothÚque. Une seule commande, trois fichiers à jour.

Pour une dépendance de développement (tests, lint, outils) :

poetry add --group dev pytest
poetry add --group dev ruff black mypy

Retirer une dĂ©pendance ? poetry remove requests. Voir l’arbre des dĂ©pendances ? poetry show --tree. Tout est pensĂ© pour que la maintenance reste simple, mĂȘme quand le projet grossit.

poetry.lock : la reproductibilité absolue

Pourquoi verrouiller les versions ?

Le pyproject.toml dĂ©clare des contraintes (^2.32.0), pas des versions exactes. C’est volontaire : tu veux pouvoir bĂ©nĂ©ficier des correctifs de sĂ©curitĂ©. Mais pour garantir que tout le monde (toi, tes collĂšgues, la CI, la production) utilise exactement les mĂȘmes versions, Poetry gĂ©nĂšre poetry.lock : un fichier qui fige la version prĂ©cise de chaque package du graphe de dĂ©pendances.

Le poetry.lock doit ĂȘtre commitĂ© dans Git. C’est lui qui rend les installations reproductibles :

  • Sur ta machine : poetry install installe les versions exactes du lock
  • Chez ton collĂšgue : mĂȘme rĂ©sultat, mĂȘme commande
  • En CI : mĂȘme chose encore — fini le « mais ça marchait sur ma machine »

Quand tu veux mettre à jour tes dépendances, tu utilises poetry update (ou poetry update requests pour une seule). Poetry recalcule le graphe et met à jour le lock en conservant les contraintes de ton pyproject.toml.

Les groupes de dépendances

Un projet sérieux a plusieurs types de dépendances : celles nécessaires en production, celles pour les tests, celles pour le développement. Poetry les organise en groupes :

[tool.poetry.group.test.dependencies]
pytest = "^8.0.0"
pytest-cov = "^5.0.0"

[tool.poetry.group.docs.dependencies]
mkdocs = "^1.6.0"

Par défaut, poetry install installe tous les groupes. Mais tu peux choisir :

# Production uniquement (ex: image Docker)
poetry install --only main

# Tests uniquement
poetry install --with test

# Tout sauf la doc
poetry install --without docs

C’est particuliĂšrement utile pour construire des images Docker lĂ©gĂšres ou des environnements de production minimalistes : tu n’installes que ce dont l’application a rĂ©ellement besoin.

Empaqueter et publier

Poetry ne s’arrĂȘte pas Ă  la gestion locale : il gĂšre aussi le packaging. Quand ton projet est prĂȘt Ă  ĂȘtre distribuĂ© :

poetry build

Cette commande gĂ©nĂšre une archive source (.tar.gz) et une wheel (.whl) dans le dossier dist/. La wheel est le format moderne d’installation : plus rapide, plus fiable. Pour publier sur PyPI (ou un registre privĂ©) :

poetry publish

Poetry utilise les identifiants configurĂ©s (via poetry config ou des variables d’environnement) et publie les deux archives. Tout ton workflow de distribution tient dans deux commandes, sans outil sĂ©parĂ© comme twine.

Migrer depuis pip + requirements.txt

Migrer un projet existant est simple. La démarche :

  1. Générer un pyproject.toml avec poetry init
  2. Ajouter tes dĂ©pendances avec poetry add (en t’appuyant sur ton requirements.txt actuel)
  3. Supprimer requirements.txt et les scripts d’activation manuels de venv
  4. VĂ©rifier avec poetry install que tout s’installe depuis zĂ©ro

Un conseil : profite de la migration pour trier tes dépendances. Beaucoup de projets accumulent des bibliothÚques inutilisées dans leurs requirements.txt. Avec Poetry, tu peux facilement identifier ce qui est réellement importé et ce qui ne sert plus.

Poetry en équipe et en CI/CD

Poetry brille particuliĂšrement dĂšs qu’on travaille Ă  plusieurs. Le workflow type :

  • Onboarding : un nouveau dĂ©veloppeur clone le dĂ©pĂŽt et lance poetry install. En quelques secondes, il a exactement le mĂȘme environnement que toute l’Ă©quipe.
  • Pull requests : les changements de dĂ©pendances apparaissent comme des diffs propres dans pyproject.toml et poetry.lock, faciles Ă  relire.
  • CI : dans GitHub Actions ou GitLab CI, l’installation devient poetry install --with test, puis tu lances tes tests avec poetry run pytest.

Il existe aussi une action officielle snok/install-poetry pour GitHub Actions qui configure Poetry en quelques lignes de YAML. Le rĂ©sultat : une CI plus simple, plus rapide Ă  Ă©crire, et beaucoup moins de mystĂšres d’environnement.

Limites et alternatives

Poetry n’est pas parfait. Ses points faibles historiques : un rĂ©solveur parfois lent sur les gros projets, et une empreinte plus lourde que des outils minimalistes. Des alternatives existent :

  • uv : l’outil en Rust qui monte en puissance, extrĂȘmement rapide, compatible avec le format pyproject.toml et mĂȘme avec les fichiers Poetry
  • pip-tools : l’approche minimaliste — pip + un gĂ©nĂ©rateur de lock (pip-compile)
  • pip + venv : toujours valable pour les projets trĂšs simples

Mon avis : si tu dĂ©butes en gestion de projet Python, Poetry reste le meilleur point d’entrĂ©e. Sa documentation est excellente, son workflow est cohĂ©rent, et les concepts que tu apprends (lock, groupes, contraintes sĂ©mantiques) se transfĂšrent tels quels vers uv ou pip-tools si tu changes d’outil plus tard.

Conclusion

Poetry modernise en profondeur la gestion de projet Python : dĂ©pendances dĂ©clarĂ©es dans un fichier standard, environnement virtuel gĂ©rĂ© automatiquement, versions verrouillĂ©es pour la reproductibilitĂ©, packaging prĂȘt pour PyPI. Pour un dĂ©veloppeur, c’est un gain de temps quotidien — et pour une Ă©quipe, c’est la fin des problĂšmes d’environnement.

Si tu dĂ©butes ou si tu veux consolider tes bases Python (structures de donnĂ©es, programmation orientĂ©e objet, gestion de projet), le cours Python — Les fondamentaux sur adamcours.fr t’accompagne pas Ă  pas avec des exercices pratiques.

Tu utilises dĂ©jĂ  Poetry, uv ou pip-tools dans tes projets ? Dis-moi en commentaire quel outil tu prĂ©fĂšres et pourquoi — c’est en confrontant les pratiques qu’on progresse le plus vite.