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.txtoĂč 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.lockpour 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 --versionTu peux aussi installer Poetry avec pipx, si tu l’utilises dĂ©jĂ pour tes outils en ligne de commande :
pipx install poetryDans 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-projetTu obtiens une arborescence propre et prĂȘte Ă l’emploi :
mon-projet/
âââ mon_projet/
â âââ __init__.py
âââ tests/
â âââ test_mon_projet.py
âââ pyproject.toml
âââ README.md
âââ .gitignorePour 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 initLe 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.0signifie « 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 installCette 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 infoPour exĂ©cuter une commande dans l’environnement du projet, deux options :
poetry run python main.pyâ exĂ©cute une commande ponctuelle dans le bon environnementpoetry 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 requestsPoetry 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 mypyRetirer 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 installinstalle 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 docsC’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 buildCette 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 publishPoetry 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 :
- Générer un
pyproject.tomlavecpoetry init - Ajouter tes dépendances avec
poetry add(en t’appuyant sur tonrequirements.txtactuel) - Supprimer
requirements.txtet les scripts d’activation manuels de venv - VĂ©rifier avec
poetry installque 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.tomletpoetry.lock, faciles Ă relire. - CI : dans GitHub Actions ou GitLab CI, l’installation devient
poetry install --with test, puis tu lances tes tests avecpoetry 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.tomlet 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.