
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. Dans ce cours, vous apprendrez Ă gĂ©rer votre environnement avec UV, un outil moderne, ultra-rapide et complet qui permet de centraliser la gestion des dĂ©pendances, des environnements virtuels et des versions de Python.
Quâest-ce qui peut se passer quand on travaille sur un projet en Python sans utiliser UV ?
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) :
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.
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 dessous-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.
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 deux 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â (autrement dit, lâenfer des dĂ©pendances). 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).
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 jusquâĂ 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 UV.
UV 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 !
En plus dâĂȘtre trĂšs simple Ă utiliser, UV 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, UV s'intĂšgre trĂšs bien avec dâautres outils contemporains utilisĂ©s par les Data Scientists, ML Engineers et Data Engineers, car ils utilisent Ă©galement ce format.
Partager un environnement UV (via le fichier .tom et le fichier.lock dont on parlera tout Ă lâheure) 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 UV 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 Poetry, 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 :
UV est le seul package manager Ă utiliser le langage Rust sous le capot. Ce qui fait de lui lâoutil le plus rapide de trĂšs loin pour installer un ensemble complexe de packages
Conda, le package manager le plus connu chez les Data Scientists juniors, est souvent utilisĂ© en conjonction avec la suite Anaconda qui nâest pas gratuite pour les entreprises de plus de 200 employĂ©s. Alors quâUV 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 !
UV est trĂšs simple Ă installer. Il suffit de suivre les instructions de leur documentation officielle. PrivilĂ©giez une installation via votre Terminal, plutĂŽt quâavec pip en Python.
Une fois installĂ©, vous pouvez vĂ©rifier que votre installation sâest correctement dĂ©roulĂ©e en tapant dans le mĂȘme terminal la commande :Â
<span><span><span>âââ(bash)
</span>
<span>uv
</span>
<span>âââ
</span>
<span>Ce qui devrait vous afficher un message comme ceci :
</span>
<span>âââ(bash)
</span>
<span>An extremely fast Python package manager.
</span>
<span>Usage : uv [OPTIONS] <command></command>
</span>
<span>etc.
</span>
<span>âââ
</span></span></span>Si cette Ă©tape ne fonctionne pas, vous pouvez essayer de redĂ©marrer le terminal avant de la retester.Â
Lancer dans votre terminal la commande :
uv init nom_dossier_de_votre_choix
Cela va crĂ©er dans votre rĂ©pertoire actuel, un nouveau dossier avec le nom que vous avez spĂ©cifiĂ©. Au sein de ce dossier, vous allez trouver 3 fichiers :Â
Un README.md, exactement le mĂȘme que dans un rĂ©po Git. Il a le mĂȘme objectif et ne vous fait que gagner un peu de temps au lieu de le crĂ©er par vous-mĂȘme.
Un script pythonmain.py, qui nâest en rĂ©alitĂ© quâun script gĂ©nĂ©rique, ne contenant pas grand-chose.
Un fichier pyproject.toml . Câest le fichier le plus important parmi les 3 et le plus central dans votre usage dâUV.Â
Si vous ouvrez ce fichier pyproject.toml  (avec un VSCode par exemple), vous verrez une structure comme la suivante :Â

Les deux lignes les plus importantes pour le moment sont celles avec ârequires-pythonâ et âdependenciesâ.
La premiĂšre ligne vient encadrer la version de Python qui doit ĂȘtre utilisĂ©e par le projet oĂč se trouve le fichier pyproject.toml. En effet, le dependency hell nâest pas causĂ© que par des versions diffĂ©rentes de package, mais Ă©galement par des versions diffĂ©rentes de Python, dâun PC Ă lâautre (tout simplement car certaines versions de packages sont conçues pour certaines versions de Python et pas dâautres.).Â
Dans mon screenshot, il est prĂ©cisĂ© que seules les versions supĂ©rieures ou Ă©gales Ă Python 3.12.0 peuvent ĂȘtre utilisĂ©es. Cela aura toute son importance juste aprĂšs.Â
La ligne âdependenciesâ se prĂ©sente comme une liste vide. Câest dans cette liste que nous allons spĂ©cifier tous les packages principaux de notre projet.Et nous faisons cela, non pas en remplissant la liste directement, mais en utilisant la commande :
<span><span><span>âââ(bash)
</span>
<span>uv add nom_du_package
</span>
<span>âââ
</span></span></span>Assurez-vous toujours que vous vous trouvez dans le mĂȘme dossier que celui contenant le pyproject.toml ! Je vais utiliseruv add pour ajouter plusieurs packages classiques dâun projet Ă base machine learning : pandas, scikit-learn, mlflow, matplotlib, ipykernel, shap.
Au moment de mon premier  uv add, on voit ceci au niveau du terminal :

DĂ©jĂ on voit quâUV est allĂ© chercher dans le PC une version de Python compatible avec ce qui a Ă©tĂ© spĂ©cifiĂ© dans le pyproject.toml. Sachez que si le PC nâavait pas cette version de Python dâinstallĂ©e, UV serait allĂ© tĂ©lĂ©charger et installer cette version de maniĂšre autonome.Â
Ensuite, aprĂšs la fin de la commande, si vous regardez votre rĂ©pertoire, vous verrez quâun nouveau fichier est apparu ! Il sâagit du fichier uv.lock. On va en parler juste aprĂšs ;)Â
AprĂšs avoir installĂ© tous les packages, regardons Ă quoi ressemble le fichier  pyproject.tomlÂ

Non seulement les noms de packages sont prĂ©sents, mais UV a Ă©galement rajoutĂ© des contraintes sur leurs versions. En rĂ©alitĂ©, nous pouvons contrĂŽler ces contraintes nous-mĂȘmes ! On vous donnera un exemple tout Ă lâheure ;)Â
Maintenant passons au fichier uv.lock ! Si vous lâouvrez, vous verrez un fichier trĂšs long ⊠trop long. Toutefois, câest un fichier trĂšs facile Ă comprendre ! Par exemple, faisons un Ctrl F pour trouver mlflow. Vous devriez trouver un screenshot ressemblant au suivant :Â

Toutefois, nous avons oubliĂ© dâinstaller certains packages. En effet, nous nâavons pas du tout dĂ©clarĂ© Ă UV 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 commandepoetry add.Â
Rentrez les commandes suivantes :
uv 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 )
uv add jupyterlab
On est tout bon !
Pour le moment, lâenvironnement a Ă©tĂ© créé grĂące aux uv add successifs, mais il nâa pas encore Ă©tĂ© activĂ© !Â
Pour ce faire, rentrez dans votre terminal la commande :
 .venv\Scripts\activate si vous ĂȘtes sous Windows en Powershell
source .venv/bin/activate
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 deactivate. Ceci vous fait quitter votre environnement virtuel dĂ©diĂ© au projet.
Avec UV, vous pouvez également effectuer les opérations suivantes :
Désinstaller une dépendance :  uv remove
Rafraßchir votre environnement virtuel, si jamais vous avez modifié le fichier  pyproject.toml : uv sync
Si vous ĂȘtes curieux, vous pouvez regarder toutes les sous-dĂ©pendances de vos packages avec :  uv treeÂ
Si vous ĂȘtes encore plus curieux, voici toutes les commandes possibles que vous pouvez rĂ©aliser avec UV.
Le dependency hell est un problÚme récurrent dans tous les projets utilisant plusieurs packages.
UV est lâun des outils contemporains qui permet de contourner le dependency hell
UV permet le management des dépendances dans un environnement virtuel Python isolé
La ârecetteâ de l'environnement UV est stockĂ©e dans le fichier pyproject.toml. Cette ârecetteâ cuisinĂ©e figure dans le fichieruv.lock
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.