Les environnements virtuels en Python avec anaconda
- 2021-06-15
- Publié par : Christophe DELEUZE
- Catégorie : Anaconda
Plus vous devenez assidu dans le développement, plus vous allez développer et gérer des projets différents. Cela vous amènera inévitablement à devoir anticiper et vivre avec les problématiques des dépendances spécifiques à chaque projet.
Or, si vous ne travaillez que dans un seul environnement, le jour où une mise à jour d’une librairie de cet environnement cassera l’ensemble de vos projets, ça sera l’apocalypse pour vous ! Pour palier à cela, la solution incontournable : les environnements virtuels.
Le principe est simple, pour chaque projet sur lequel vous intervenez, dédiez-lui un environnement isolé avec ses propres librairies et dépendances.
Comme nous travaillons avec des projets en Python pur, pour la gestion des packages, on travaillera avec pip et on délèguera la gestion de l’environnement à Conda selon le principe suivant :
De cette façon, fini les galères des dépendances croisées et finis les risques de casser vos projets non courants.
L'environnement virtuel comme base de travail
Un environnement virtuel regroupe des installations de Python isolées de l’OS et séparées les unes des autres pour chaque projet.
Les vieux de la vieille vous parlerons sans aucun doute de virtualenv et de buildout, deux solutions qui méritent largement un article dédié. Toutefois, aujourd’hui je vous propose d’aborder la thématique des environnements virtuels avec la toute jeune, mais non moins célèbre, distribution Anaconda.
Anaconda est une distribution libre et open source des langages de programmation Python et R appliqué au développement d’applications dédiées à la science des données et à l’apprentissage automatique (traitement de données à grande échelle, analyse prédictive, calcul scientifique). Cette distribution vise à simplifier la gestion des paquets et de déploiement, ce qui répond parfaitement à notre problématique. C’est pour cette raison que j’ai choisi d’en parler et que nous allons voir ensemble qu’elles en sont les bonnes pratiques.
Une distribution pour les gouverner tous
La distribution Anaconda (3 Go) est téléchargeable ici :
https://www.anaconda.com/products/individual
Toutefois, si la taille sur votre disque dur est un critère discriminant, une version plus légère nommée miniconda existe (58 Mo). C’est une alternative tout à fait acceptable par rapport à la version standard et à l’utilisation que nous allons en avoir.
Voici le lien pour la télécharger :
https://docs.conda.io/en/latest/miniconda.html
Une fois installée, Anaconda pourra très simplement s’utiliser avec votre IDE préférée tel que pycharm. Dans ce cas, il vous suffira de choisir Conda pour la gestion des environnements virtuels lors de la création de vos projets. À noter que pycharm créera alors un environnement virtuel dédié à votre projet. Celui-ci sera alors accessible aussi par Anaconda.
Anaconda vous offre nativement :
- un interpréteur interactif dédié au Python ;
- un gestionnaire d’environnements virtuels ;
- un gestionnaire de packages.
Installer des dépendances avec pip et conda
Conda est donc un outil de packaging et un installateur. À ce titre, il peut être comparé à pip qui est la référence pour installer des packages en Python.
Voici une liste non exhaustive des principales commandes pour installer, désinstaller et lister des packages.
Installer un package :
pip install nom-du-package
conda install nom-du-package
Désinstaller un package :
pip uninstall nom-du-package
conda remove nom-du-package
Lister des packages :
pip list
conda list
Créer un requirement.txt pour votre projet :
pip freeze > requirements.txt
Installer des dépendances à partir d’un fichier requirement.txt :
pip install -r c:\.....\requirements.txt
Le gestionnaire de package pip
Conda et pip sont souvent considérés comme presque identiques. Bien que certaines fonctionnalités de ces deux outils se chevauchent, ils ont été conçus et doivent être utilisés à des fins différentes. Pip est l’outil recommandé par la Python Packaging Authority pour installer des packages à partir du Python Packages Index, PyPI. Pip permet d’installer des librairies tierces qui viennent s’ajouter aux packages standard Python. Les installations sont faites à partie de roues (wheel) ou de directement à partir de la distribution des sources des librairies. Ce dernier peut nécessiter que le système ait des compilateurs compatibles, et éventuellement des bibliothèques, installés avant d’appeler pip pour réussir.
Le gestionnaire de package Conda
Conda est un gestionnaire de packages et d’environnements multiplateformes qui installe et gère les packages conda à partir du Référentiel Anaconda ainsi que du Cloud d’anaconda. Les packages Conda sont des binaires. Il n’est jamais nécessaire d’avoir des compilateurs disponibles pour les installer. De plus, les packages conda ne sont pas limités au logiciel Python. Ils peuvent également contenir des bibliothèques C ou C++, des packages R ou tout autre logiciel.
Les différences fondamentale entre pip et conda
Cela met en évidence une différence clé entre conda et pip. Pip installe des packages Python tandis que conda installe des packages pouvant contenir des logiciels écrits dans n’importe quelle langue. Par exemple, avant d’utiliser pip, un interpréteur Python doit être installé via un gestionnaire de packages système ou en téléchargeant et en exécutant un programme d’installation. Conda, quant à lui, peut installer directement les packages Python ainsi que l’interpréteur Python.
Une autre différence clé entre les deux outils est que conda a la capacité de créer des environnements isolés pouvant contenir différentes versions de Python et/ou les packages qui y sont installés. Cela peut être extrêmement utile lorsque vous travaillez avec des outils de science des données, car différents outils peuvent contenir des exigences contradictoires qui pourraient empêcher leur installation dans un seul environnement. Pip n’a pas de support intégré pour les environnements, mais dépend plutôt d’autres outils comme virtualenv ou alors venv pour créer des environnements isolés. Des outils tels que pipenv, poetry et hatch englobent pip et virtualenv pour fournir une méthode unifiée pour travailler avec ces environnements.
Pip et conda diffèrent également dans la manière dont les relations de dépendance au sein d’un environnement sont remplies. Lors de l’installation de packages, pip installe les dépendances dans une boucle sérielle récursive. Aucun effort n’est fait pour s’assurer que les dépendances de tous les packages sont remplis simultanément. Cela peut conduire à des environnements qui sont brisés de manière subtile, si les packages installés plus tôt dans la commande ont des versions de dépendance incompatibles par rapport aux packages installés plus tard dans la commande. En revanche, conda utilise un solveur de satisfiabilité (SAT) pour vérifier que toutes les exigences de tous les packages installés dans un environnement sont remplies. Cette vérification peut prendre plus de temps, mais permet d’éviter la création d’environnements défectueux. Tant que les métadonnées du package sur les dépendances sont correctes, conda produira de manière prévisible des environnements de travail. Pour les personnes travaillant exclusivement avec pip, conda nous offre une alternative pour nous aider à identifier les problèmes de dépendances croisées.
Choisir le bon gestionnaire de package
Compte tenu des similitudes entre conda et pip, il n’est pas surprenant d’essayer de combiner ces outils pour créer des environnements. L’une des principales raisons de combiner pip avec conda est qu’un ou plusieurs packages ne peuvent être installés que via pip. Plus de 1 500 packages sont disponibles dans le référentiel Anaconda. Malgré cette grande collection de packages, elle est encore petite par rapport aux plus de 150 000 packages disponibles sur PyPI. Parfois, vous avez besoin d’un package qui n’est pas disponible en tant que package conda mais qui est disponible sur PyPI et peut être installé avec pip. Dans ces cas, il est logique d’essayer d’utiliser à la fois conda et pip.
Vous l’aurez compris, conda est une alternative crédible à pip. Pourtant, si je dois choisir un gestionnaire de package pour un projet Python pur, malgré tous les apports de conda je m’orienterai exclusivement vers pip.
Pip est maintenant inclus nativement dans l’installeur de Python depuis la version 3.4. Utiliser pip c’est donc aussi bénéficier de la compatibilité du langage avec pléthore d’écosystèmes. À l’heure des dockers, avec l’explosion des distributions de type alpine pour des systèmes toujours moins gourmands en mémoire, utiliser pip est un gage de fiabilité et d’intégration rapide. conda quant à lui, pourrait nécessiter quelques efforts supplémentaires pour s’intégrer dans l’environnement de votre docker par exemple. De plus, pip travaillant directement avec des sources, vous pourrez les contrôler et les vérifier, ce qui a beaucoup de valeur au regard d’une entreprise.
Pour résumer :
| Comparaison de conda et pip | conda | pip |
|---|---|---|
| Gère | Binaires | Roue ou Source |
| Peut nécessiter des compilateurs | Non | Oui |
| Type de package | Quelconque | Python uniquement |
| Créer un environnement | Oui, intégré | Non, nécessite virtualenv ou venv |
| Vérifications de dépendances | Oui | Non |
| Sources des paquets | Dépôt et cloud Anaconda | PyPI |
Travailler dans des environnements virtuels avec conda
Conda sait créer également des environnements virtuels, comme le ferait virtualenv :
conda create -n mon_environement python=3.11
Suite à cette commande, Anaconda va créer un dossier avec un environnement complet dedans : l’interpréteur Python 3.9, les libs, etc. C’est votre installation isolée.
D’ailleurs, si nous appelons la même commande sans lui préciser la version de python, celle installée sera la version de python livrée par défaut avec Anaconda :
conda create -n mon_environement
Si vous utilisez virtualenv, pour utiliser des versions différentes de Python, il faudra juste que les deux versions soient installées sur votre système.
De ce point de vue, conda apporte une simplification dans la gestion des environnements et des setups Python.
Maintenant, pour activer votre environnement et travailler dedans, rien de plus simple :
conda activate mon_environement
Vous remarquerez aussi immédiatement que votre prompt de ligne de commande va changer pour indiquer que vous allez travailler dans un environnement virtuel :
(mon_environement) C:\dev $
À partir de là, toute commande exécutée dans ce terminal fera uniquement appel à la version de Python associée à l’environnement virtuel. Votre code aura aussi accès à chaque librairie externe exclusivement installée dans cet environnement.
En dehors de l’environnement : Point de Salut !
Enfin, quand on a fini, on oublie de fermer notre espace de travail :
conda deactivate
Le mot de la fin
Vous l’aurez compris, travailler avec des environnements virtuels et savoir correctement gérer vos packages n’est pas un gadget ou un hobby de geek, mais bien quelque-chose d’essentiel. C’est une composante de la vie courante du développeur et Anaconda est une distribution très mature qui vous permettra de rapidement monter en compétence sur ce sujet.
Comme à l’accoutumée, si vous avez apprécié ou si vous avez des questions, les commentaires sont là pour vous exprimer.
Merci pour ce resumé succint et très clair !