Poetry: enfin l’outil pour charmer Python ?

Poetry: enfin l’outil pour charmer Python ?
poetry - python pipenv pdm pyflow

Jeune développeur, allons voir si ton wheel,
De son packaging si difficile,
Et de sa robe de pourpre sur ton poste,
A point perdu quand tu exportes
De sa compatibilité si complexe
Et de son gain si perplexe.

Ah le packaging en Python! Une étape nécessaire mais malheureusement assez douloureuse lors de la gestion des projets Python.

Il est en effet assez facile de s’y perdre lors de la gestion des compatibilités entre les différentes versions des packages Python mais aussi et surtout avec les multiples versions de Python à disposition. Nous allons voir à l’aide ce billet de blog une solution nommée Poetry qui promet de nous faciliter la tâche et de rendre le packaging, le build ainsi que le déploiement de nos applications Python aussi simple que possible.

Poetry: les concepts

Projet open source, Poetry se base essentiellement sur des outils assez classiques dans le développement des projets Python tel que pip, venv ou pyenv mais apporte une surcouche qui change l’expérience développeur. Un projet géré par Poetry se base essentiellement sur deux fichiers: pyproject.toml et poetry.lock

Regardons ce que contiennent ces deux fichiers.

pyproject.toml

À l’initialisation de votre projet il est composé de :

  • tool.poetry: renseigne des informations sur votre projet (nom, version, description et auteur)
  • tool.poetry.dependencies: les dépendances du projet installées dans un environnement de production
  • tool.poetry.dev-dependencies: les dépendances du projet installées dans un environnement de dev

Cette distinction entre l’environnement de dev et celui de production nous permet en tant que développeur d’avoir des versions différentes de nos packages ou de nouvelles dépendances qu’il est inutile d’avoir en environnement de production, il est ainsi possible de tester de nouvelles fonctionnalités de manière sereine et isolée sans avoir à installer et ensuite désinstaller ces packages.

Il aura ainsi cette configuration à la création d’un projet nommé, par exemple, poetry-demo:

CODE: https://gist.github.com/ElhadiCherifi95/611d81ee5ba98bdde00493eb721e4b20.js

Le fichier pyproject.toml peut incorporer à lui seul le contenu des fichiers requirements.txt,  setup.py, setup.cfg, MANIFEST.in ainsi que le fichier Pipfile. L’ensemble des fonctionnalités qu’il est possible d’intégrer sont listées ici.

Notez aussi l’utilisation de wildcard python = "*"  ou encore pytest = "^7.1" pour spécifier les versions de vos dépendances, cette manière de faire offre la possibilité de maitriser les futurs versions que Poetry va installer dans le cas d’un update. Elles ne sont pas forcément figées à une version particulière. Nous y reviendrons un peu plus tard dans l’article.

poetry.lock

Une fois vos dépendances installées, Poetry génère un fichier poetry.lock qui centralise toutes les versions exactes de votre projet Python. Ce fichier est capital pour figer les versions des dépendances utilisées. En effet, étant donné que dans le fichier pyproject.toml les versions citées ne sont pas précises avec l’utilisation des wildcards et qu’ils sont souvent amenées à évoluer dans le cas d’une mise à jour, le fichier poetry.lock les renseigne et nous garantit que si ces versions exactes sont installées, alors le projet peut être buildé.

C’est une bonne pratique de rajouter le fichier poetry.lock à git pour garantir aux développeurs (y compris vous même), à votre CI ou encore vos serveurs de production la résilience de votre projet en cas d’une nouvelle release de vos dépendances.

Le fichier pyproject.toml représente la vision à long terme des dépendances en cas d’update, ce qui nous permet d’être serein si un update à lieu. Le fichier poetry.lock quand à lui ****fige ****les versions avec lequelles le programme marche en ce temps T (ce qui assure que le code n’aura pas de conflit de dépendances sur aucune des machines (local, sur la CI, en production, …)).

Poetry: dans la vraie vie

La surcouche apportée dans Poetry nous apporte une facilité déconcertante dans le développement des projets Python, ainsi il suffit de lancer les commandes suivantes pour:

  • Créer/Activer un virtual environment:

CODE: https://gist.github.com/ElhadiCherifi95/3fc8821430c32cbe1c39e397771448a6.js

  • Ajouter supprimer ou updater une dépendance:

CODE: https://gist.github.com/ElhadiCherifi95/6069c546fbeece7d30ca911d538e36b9.js

Cette requête est très utile pour avoir une idée claire des versions utilisées, elle a pour résultat une sorte d’arbre qui contient les dépendances, leurs versions mais aussi les sous dépendances installées, voici son retour pour le projet de démo:

retour de poetry pour le projet de démo
  • Installer les dépendances:

CODE: https://gist.github.com/ElhadiCherifi95/f81a863ade0c40891cb0c62f9b0918e7.js

Poetry récupère l’ensemble des versions à installer à partir du fichier poetry.lock s’il est existant. Et s’il n’existe pas (au début du projet par exemple), Poetry se base sur le fichier pyproject.toml pour récupérer les dernières versions disponibles des packages cités.

  • Build son application:

CODE: https://gist.github.com/ElhadiCherifi95/833deab23fdafc55d53ed470673fc8d6.js

Cette commande génère un fichier .wheel et un fichier .sdist qui représentent votre projet sous forme de package livrable et réutilisable.

  • Publier son application:

CODE: https://gist.github.com/ElhadiCherifi95/a1a5f2fa884e6b9bd753d98cfcbc1bdc.js

Cette commande permet de déployer votre projet dans un repository privé qui a été préalablement configuré. Si l’option -r n’est pas spécifiée, le déploiement se fera dans pypi.

  • Exécuter du code python:

CODE: https://gist.github.com/ElhadiCherifi95/82e78702fd16dc1b17acd5b1c9cb2614.js

  • Changer d’environnement Python:

CODE: https://gist.github.com/ElhadiCherifi95/e5c0f253b855fd9f00c0dd3dfdcd89cc.js

  • Lancer les tests unitaires avec pytest:

CODE: https://gist.github.com/ElhadiCherifi95/c159ceffe6ff8a2139ab19cdea31112a.js

Spécifier la version des dépendances avec Poetry

Comme cité plus haut, il est possible de configurer précisément les nouvelles versions de nos dépendances que Poetry est amené à installer lors d’une commande d’update. Géré par des wildcards, cette manière de faire nous permet d’assurer une actualisation de nos dépendances en évitant, si on le souhaite, de passer à des versions majeures pour éviter de casser la compatibilité.

Par exemple, pour spécifier qu’une dépendance ne peut être actualisée en version majeure on peut utiliser la syntaxe suivante dans votre fichier pyproject.toml:

CODE: https://gist.github.com/ElhadiCherifi95/2185d5aa525a8a15dc6fc27c9781d7ad.js

Cette spécification permettra de mettre à jour le package pytest jusqu’à la version 1.3.0. Ainsi, si une version majeure 2.0.0 est amenée à exister, elle ne sera pas installée pour éviter d’avoir des erreurs de rétro-compatibilité. Pour voir l’ensemble des possibilités que propose Poetry concernant les wlidcards, tout est listé ici.

Conclusion

Poetry regroupe à lui seul un ensemble d’outils que l’on devait auparavant utiliser individuellement pour faire vivre nos projets Python (pyenv, venv, pip, twine, ...). Et il fait bien plus que cela, en s’assurant d’avoir toujours un projet qui a des dépendances à jour sans forcément casser la compatibilité.

🙏 Cliquez ici vous avez aimé cet article, aidez nous à gagner en visibilité en le partageant sur Linkedin 🙏
Plus d'articles de
Cliquez
ici
si vous avez encore
10 minutes