Découvrez l’utilité de Poetry
Avant de se lancer dans l’installation de Poetry, il est essentiel de comprendre que sans un tel outil ou un équivalent, votre projet Dev ou Data en Python peut être confronté à plusieurs problèmes.
Qu’est-ce qui peut se passer quand on travaille sur un projet en Python sans utiliser Poetry ?
Imaginons que vous travaillez sur un projet Dev ou Data depuis quelques semaines. Votre code et/ou vos Jupyter Notebooks fonctionnent aujourd’hui très bien sur votre ordinateur. En revanche, au fur et à mesure que votre projet gagne en visibilité par son succès, les lignes de codes ainsi que la quantité de packages utilisés vont se multiplier. Vous risquez ainsi de rencontrer au moins l’un des problèmes suivants (si ce n’est pas plusieurs en même temps) :
1/ Votre collègue n’arrive pas à faire tourner votre code.
En partageant simplement votre notebook avec un de vos collègues (en règle générale via Git, mais le raisonnement reste le même par e-mail, sharepoint ou autre), il n’y a aucune garantie que votre collègue soit capable de reproduire votre code.
En effet, les versions de Python et des packages (Pandas, SQLAlchemy, Seaborn etc.) qu’il a installées sur son ordinateur pourraient ne pas être identiques aux vôtres.
Si votre code utilise des fonctionnalités nouvelles ou obsolète d’un package (car votre version est différente), votre code ne fonctionnera pas comme prévu lors de son exécution, voire ne fonctionnera pas du tout.
Rencontrer ce problème devient de plus en plus probable si le nombre de packages que vous utilisez augmente.
2/ Votre projet devient plus complexe, et vous n’arrivez pas à installer de nouveaux packages.
Si les besoins de votre projet vous poussent à installer d’autres packages de manière directe, vous pouvez rencontrer des problèmes d’installation à cause de conflits de version.
En effet, quand vous installez un package comme Pandas, vous installez en réalité plusieurs sous-packages simultanément sous le capot. Nous appelons ces packages des sous-dépendances. Les librairies incontournables en Python pour l’analyse de données (comme Pandas et scikit-learn par exemple) possèdent des sous-dépendances.
Sans une gestion soignée, les sous-dépendances peuvent vous empêcher d’installer de nouveaux packages. Prenons cet exemple fictif, mais tout à fait plausible pour illustrer :
Si vous avez installé la version 1.3.5 de Pandas, vous avez probablement comme sous-dépendance la version 1.17.3 de Numpy.
Si vous essayez alors d’installer scikit-learn de manière directe pour les besoins de votre projet, sans préciser de version spécifique, vous aurez probablement une version récente de scikit-learn qui utilise comme sous-dépendance la version 1.20.0 de Numpy.
L’installation de scikit-learn va échouer, car votre ordinateur ne peut pas faire coexister 2 versions différentes de Numpy dans le même environnement.
Dans le monde du développement et de la data, nous appelons ce type de problème le “dependency hell”. Il est très probable de le rencontrer quand vous multipliez les installations directes de packages, surtout quand vous utilisez des packages peu connus (et donc mis à jour moins souvent que des packages phares comme Pandas) ou alors au contraire connus pour leur quantité massive de sous-dépendances (Comme PyTorch ou Tensorflow).
3/ Votre package préféré fait peau neuve et vous voulez capitaliser sur ces nouvelles fonctionnalités
Admettons par exemple qu’un projet Dev ou Data sur lequel vous avez travaillé et déployé par le passé, utilise beaucoup Pandas pour manipuler et transformer de la donnée. Vous avez mis en production ce projet fin 2022 et vous y réalisez de la maintenance minimaliste de temps en temps pour gérer des bugs.
Vous apprenez ensuite que le tout nouveau Pandas 2.0 est désormais disponible depuis avril 2023 et qu’il propose :
Plusieurs nouvelles fonctionnalités qui permettent de simplifier le code de votre projet.
Une nouvelle sous-dépendance nommée PyArrow, qui accélère plusieurs calculs de Pandas et permet de diviser le temps d’exécution du code par 2 ou 3 ou plus
Naturellement, vous souhaitez installer de manière directe cette nouvelle version. Mais vous êtes désormais confronté au dependency hell, car la nouvelle sous-dépendance PyArrow rentre en conflit direct avec tous les autres packages que le projet requiert. Vous gagnerez alors du temps sur le long terme en utilisant un outil qui gère automatiquement cette complexité à votre place.
Je comprends toute cette histoire de conflit de versions de packages et de dependency hell. Mais vous avez employé plusieurs fois l’expression “installer de manière directe”, qu’est-ce que cela signifie ?
Bonne question ! Par “installation directe” d’un package X, j’entends une installation qui ne va pas se soucier de la compatibilité de la version du package X (et surtout de ses sous-dépendances) avec les packages qui existent déjà dans votre environnement de travail. C’est ce qu’on a envie d’éviter.
Par exemple, Pip est l’outil phare d’installation de packages en Python qui ne réalise que des installations directes. Il était d’ailleurs l’un des outils conventionnels dans le monde de la Data jusque très récemment. Mais quand les équipes Data en entreprise ont commencé à rencontrer tous les problèmes cités plus haut et à s’intéresser au MLOps, ils se sont tournés vers des alternatives plus intelligentes comme Poetry.
Définissez Poetry
Poetry combine 2 concepts :
La gestion automatisée et intelligente des dépendances et sous-dépendances.
La création d’un environnement virtuel isolé pour votre projet.
Ce deuxième point est particulièrement important à comprendre !
Un environnement virtuel en Python est un espace isolé dans lequel vous pouvez installer des packages et des dépendances spécifiques à un projet sans affecter le reste de votre système ou d'autres projets. C’est comme un "mini-système" Python autonome dans votre ordinateur, isolé du reste des installations existantes. Il contient sa propre installation de Python ainsi que ses propres versions des packages que vous installez. Cela signifie que vous pouvez avoir un environnement virtuel pour chaque projet avec des dépendances spécifiques sans qu'elles interfèrent entre elles.
En plus d’être très simple à utiliser, Poetry a l’avantage d’utiliser le format moderne .toml
qui est le standard aujourd’hui en Python quand il s’agit d’installation de packages. Ainsi, Poetry s'intègre très bien avec d’autres outils contemporains utilisés par les Data Scientists, Machine Learning Engineers et Data Engineers, car ils utilisent également ce format.
Partager un environnement Poetry (via le fichier .toml
) avec un collègue lui permet alors de reproduire votre environnement de travail (et donc vos résultats) à l’identique dans la quasi-totalité des cas, dans un environnement virtuel qui se moque de savoir si votre collègue utilise Mac ou Windows, ou de savoir comment il a installé tous ces packages ou logiciels.
Et donc Poetry est la seule alternative à Pip qui peut gérer de manière intelligente les dépendances dans un environnement virtuel ?
Pas du tout, d’autres outils de package management existent comme Pipenv ou Conda. Il y a de vastes débats concernant les avantages et les inconvénients de chacun, et les comparer en détail sortirait du cadre de ce cours. Mais nous allons nous contenter de citer les deux arguments suivants :
À l’heure actuelle, Poetry est le seul package manager en Python à utiliser le format
.toml
Conda, le package manager le plus connu chez les Data Scientists, est souvent utilisé en conjonction avec la suite Anaconda qui n’est pas gratuite pour les entreprises de plus de 200 employés. Alors que Poetry est un outil 100% open source, ne nécessitant aucune licence commerciale.
Je pense que vous avez eu votre dose d’explications théoriques.
Passons désormais à l’installation !
Installez Poetry et votre premier environnement
Installation de Poetry
Si vous êtes sous Mac ou Linux, utilisez votre terminal. Si vous êtes sous Windows, utilisez PowerShell. Dans les 2 cas, ce sera la commande “cd” qu’il faudra utiliser.
Le site officiel de Poetry recommande d’utiliser pipx
pour installer Poetry. Pour cela, dans votre terminal, entrez la commande suivante :
pip install pipx python3 -m pipx ensurepath
pipx install poetry
(Si cette étape ne fonctionne pas, vous pouvez être obligé de redémarrer le terminal avant de la relancer).
Via votre terminal ou PowerShell, déplacez-vous au sein du dossier où votre projet est stocké, en utilisant la commande cd et en précisant la localisation de votre dossier.
Déclaration des packages
Lancez dans votre terminal la commande : poetry init
.
Poetry va vous poser désormais plusieurs questions pour définir votre environnement virtuel. Pour simplifier, vous pouvez ignorer les questions liées au package name, à la version, à la description, l’auteur ou encore la licence en les laissant vides et en appuyant sur Entrée.
Si vous avez installé la version la plus récente de Python, ignorez l’étape “Compatible Python versions”, sinon précisez la version de Python que vous avez installée (pour la connaître, ouvrez un autre terminal et tapez la commande python -version
).
Ensuite, nous arrivons à l’étape essentielle, la déclaration de vos packages. Précisez “yes” comme dans le screenshot :
Pour ajouter nos packages à l’environnement isolé, nous allons simplement spécifier le nom du package. Nous allons ici sélectionner comme exemple le package Pandas.
On va vous demander de spécifier lequel des packages précisément (il existe des fois plusieurs packages avec des noms assez proches). Dans notre cas, il s’agira toujours du 1er choix. Nous tapons donc 0 dans le terminal :
À moins d’avoir des contraintes particulières, nous n’avons pas besoin au tout début d’un projet de spécifier une version du package. Il suffit de ne rien saisir et de passer à l’étape suivante avec Entrée :
On répète les mêmes étapes pour installer Matplotlib, Seaborn et Numpy (les incontournables d’un projet Data Science).
Après avoir spécifié les packages Pandas, Matplotlib, Seaborn et Numpy, on devrait arriver au screenshot suivant.
Comme vous pouvez le voir, les choix de versions de package ont été sélectionnés automatiquement ! Si vous ne comprenez pas tout ce qu’il y a dans le screenshot, ne vous en faites pas, nous aurons l’occasion de revenir là-dessus.
Tapez dans votre terminal la commande ls (elle permet de lister l’ensemble des fichiers du dossier dans lequel vous vous trouvez), vous devez voir normalement le fichier pyproject.toml
en plus de votre notebook.
Toutefois, nous avons oublié d’installer certains packages. En effet, nous n’avons pas du tout déclaré à Poetry qu’on aura besoin de JupyterLab !
Ce n’est pas grave, vous n’avez pas besoin de rajouter vous-même vos dépendances dans le fichier pyproject.toml
! Vous pouvez très facilement rajouter un package manquant à votre environnement en utilisant la commande poetry add
.
Rentrez les commandes suivantes :
poetry add ipykernel
(si l’installation de la sous-dépendance jedi échoue avec l’erreur “[WinError 206] Nom de fichier ou extension trop long” alors référez-vous à cette réponse dans le forum StackOverflow pour solutionner le problème ) ;poetry add jupyterlab
.
On est tout bon !
Activez votre environnement virtualisé
Pour le moment, l’environnement n’est pas encore créé, il a simplement été déclaré dans le fichier .toml
!
Pour créer l’environnement virtuel avec les packages déclarés, on utilise dans le terminal la commande : poetry install
.
Normalement, vous devez voir dans votre dossier un fichier poetry.lock
a apparu. Ce fichier contient les versions EXACTES de toutes les dépendances et sous-dépendances nécessaires pour reproduire votre environnement à l’identique sans conflits de versions ! Si jamais un collègue vous partage son fichier pyproject.toml
, tout ce que vous avez à faire, c’est d’utiliser poetry install
pour créer le fichier poetry.lock
et reproduire son environnement.
L’environnement a été créé, mais vous ne l’avez pas encore activé ! Pour ce faire, rentrez dans votre terminal la commande : poetry shell
.
Maintenant, vous êtes dans l’environnement virtuel isolé et vous pouvez lancer votre Jupyter Notebook depuis le terminal avec la commande : jupyter lab.
Une fois que vous avez fini de travailler sur votre projet pour aujourd’hui, revenez sur votre terminal et tapez exit. Cette commande vous fait quitter votre environnement virtuel dédié au projet.
Avec Poetry, vous pouvez également effectuer les opérations suivantes :
Désinstaller une dépendance :
poetry remove
.Poetry env list
pour regarder la liste des environnements que vous avez (pour le moment qu’un seul, mais au fil de la formation, vous en aurez plusieurs !).Si vous êtes curieux, vous pouvez regarder toutes les sous-dépendances d’un package avec la commande :
poetry show nom_du_package --tree
.Si vous êtes encore plus curieux, voici toutes les commandes possibles que vous pouvez réaliser avec Poetry.
En résumé
Le dependency hell est un problème récurrent dans tous les projets utilisant plusieurs packages.
Poetry est l’un des outils contemporains qui permet de contourner le dependency hell.
Poetry permet le management des dépendances dans un environnement virtuel Python isolé.
La logique centrale de l'environnement Poetry est stockée dans le fichier
pyproject.toml
.
Maintenant, vous avez installé Poetry et que vous avez activé votre environnement, retrouvez-moi dans le chapitre suivant pour étudier les usages avancés de cet outil.