Installez UV et lancez votre premier environnement virtuel

DĂ©couvrez l’utilitĂ© d’UV

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) :

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 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).

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 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.

Définissez 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 !

Installez UV et votre premier environnement

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. 

Déclarez des packages

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 : 

Capture d’écran d’un fichier de configuration Python au format TOML. Il contient des champs comme le nom du projet, la version, la description, le fichier README, la version minimale de Python requise et une liste vide de dĂ©pendances.
La structure du fichier pyproject.toml

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 :

Capture d’écran d’un terminal affichant la crĂ©ation d’un environnement virtuel Python avec CPython 3.12.8. L’installation du paquet numpy est en cours, avec une barre de progression indiquant 2,09 Mio sur 15,87 Mio.
Le uv add

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 

Capture d’écran d’un fichier pyproject.toml contenant les mĂ©tadonnĂ©es d’un projet Python. Il spĂ©cifie Python ≄ 3.12 et liste six dĂ©pendances, dont ipykernel, matplotlib, mlflow, pandas, scikit-learn et shap avec leurs versions minimales.
Le nouveau 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 : 

Capture d’écran d’un fichier de mĂ©tadonnĂ©es pour le paquet Python mlflow version 3.2.0. Il liste de nombreuses dĂ©pendances comme numpy, pandas, flask ou sqlalchemy, avec des conditions pour certains modules selon la plateforme systĂšme.
Les informations ML flow dans le fichier uv lock

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 !

Activez votre environnement virtualisé

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.

En résumé 

  • 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.

Ever considered an OpenClassrooms diploma?
  • Up to 100% of your training program funded
  • Flexible start date
  • Career-focused projects
  • Individual mentoring
Find the training program and funding option that suits you best