Si vous avez déjà travaillé sur plus d'un projet avec le langage Python, alors vous avez forcément fait appel à quelques librairies/paquets via pip (voir cheat sheet).

Installer des paquets à la volée et les mettre à jour au fur et à mesure peut vous paraître trivial et sans conséquences. Toutefois, les problèmes commencent à apparaître lorsque les librairies évoluent alors qu'un code reste inchangé. Imaginons la situation selon deux points de vue: celui du développeur et celui de l'utilisateur.

Coté développeur, imaginez que vous ayez besoin dans l'urgence, de reprendre un projet laissé à l'abandon. Or depuis le temps, les librairies et/ou la version de Python ont été mises à jour mais ne sont plus compatibles (fonctions dépréciées, supprimées, etc.). Vous allez devoir vous replonger dans du code que vous avez oublié, ou le refaire si vous n'en êtes pas l'auteur. Notez d'ailleurs que la plupart du temps, les commentaires seront mal faits ou inexistants. Ce genre de code va au mieux faire perdre un temps considérable à la personne qui le reprend ou qui en a besoin, et au pire être inutilisable.

Coté utilisateur, la situation deviendra vite insoluble si celui-ci travaille sur plusieurs projets nécessitant chacun des versions différentes de librairies. De plus, si les dépendances ne sont ni répertoriées, ni installées, le code ne marchera pas du premier coup.

Dans les deux cas, vous prendrez vraiment conscience de la définition du mot bordel. Et pire, vous en prendrez conscience dans l'urgence car c'est toujours au plus mauvais moment qu'on perd le plus de temps. Vous voilà prévenus.

L'utilisation des environnements virtuels avec Python permet d'avoir des projets indépendants et isolés du système. Leur mise en place fait appel au module 'virtualenv'* dans un premier temps, puis au module 'virtualenvwrapper' pour simplifier l'usage de l'ensemble.

Bref, vous l'aurez compris, les environnements c'est pour les nerds méticuleux (qui rangent leur appart une fois par trimestre).

* : virtualenv est la seule solution disponible sous Windows. Mais comme toute personne dotée de bon sens, vous ne développez pas sous Windows.

Sommaire

Virtualenv

À lui seul virtualenv suffit pour gérer les environnements virtuels, mais les commandes sont quelque peu verbeuses.

Installation

Comme d'habitude via 'pip':

pip3 install --user virtualenv

Notez que la version de pip utilisée, conditionnera la version de l'interpréteur Python par défaut des futurs environnements virtuels.

Virtualenvwrapper

Cette surcouche facilite la gestion des environnements virtuels.

Tous les modules installés alors qu'un environnement virtuel est actif le seront dans cet environnement uniquement.

Installation

Via 'pip':

pip3 install --user virtualenvwrapper

Configuration du ~/.bashrc pour un accès facilité aux environnements:

export PATH=$PATH:~/.local/bin
export WORKON_HOME=~/.virtualenvs
mkdir -p $WORKON_HOME
source ~/.local/bin/virtualenvwrapper.sh

PS: La localisation de 'virtualenvwrapper.sh' peut varier selon le type d'installation. Si vous installez virtualenvwrapper et virtualenv via pip avec le flag --user, ces exécutables seront dans ~/.local/bin. Vous feriez donc bien d'ajouter ce répertoire à votre variable $PATH. N'hésitez pas à faire une recherche sur le système (locate virtualenvwrapper, ou find / -name "virtualenvwrapper.sh")

PS2: Pour forcer l'utilisation d'un interpréteur Python par défaut et ne pas risquer de s'exposer à des surprises en cas de mise à jour système, ajoutez cette ligne avant les autres:

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.4

Utilisation

CommandesActions
mkvirtualenv votre_projetCréation d'un environnement dans ~/.virtualenvs, où que vous soyez.
rmvirtualenv votre_projetSupprimer un environnement.
workon votre_projetActiver un environnement.
deactivateSortir d'un environnement.


Le dossier ~/.virtualenvs contiendra 3 dossiers pour chaque environnement:

  • bin contient l'interpréteur python et les divers exécutables ajoutés via pip;
  • include contient les en-têtes de l'environnement Python;
  • lib contient les librairies et des liens symboliques vers les librairies standard de Python.

Lorsque vous supprimez un environnement virtuel avec rmvirtualenv, le dossier éponyme est également supprimé et le système redevient propre.

Utilisation avancée de 'mkvirtualenv'

Les options de cette commande sont les mêmes que celles de 'virtualenv'.

OptionsAction
--python=python3.4Spécifie la version de l'interpréteur Python à utiliser.
--no-site-packagesL'environnement est vierge et n'hérite que des librairies standard de Python.
--system-site-packagesL'environnement hérite des paquets déjà installés sur le système.


Notez que les versions récentes de virtualenv ont l'option '--no-site-packages' activée par défaut.

Avec pip c'est mieux !

Pip vous permet d'installer des librairies, mais également de lister les librairies installées sur le système ou dans l'environnement courant. Ceci permet de partager les caractéristiques de son installation avec les personnes qui souhaitent exécuter votre programme.

CommandesAction
pip freeze > requirements.txtLister les paquets installés et leurs versions. Exporte le tout dans un fichier. Ce fichier doit être livré avec votre projet !
pip freeze --localLister les paquets installés dans l'environnement uniquement (ne tient pas compte des paquets système hérités à cause de '--system-site-packages'.
pip install -r requirements.txtInstalle tous les paquets listés dans le fichier requirements.txt.

Conclusion

Utiliser un programme dans un environnement testé et éprouvé n'est pas si courant parmi les langages de programmation. Python est un langage remarquable en ce qui concerne le packaging. En effet, ici vous avez 2 garde-fous:

  • Les développeurs des librairies qui ont comme toujours, la responsabilité de ne pas casser la compatibilité;
  • Les développeurs des programmes qui peuvent assurer que tout fonctionnera dans un environnement totalement maîtrisé et reproductible.

D'une manière générale, si vous ne produisez pas un code maintenable, réutilisable, et diffusable alors autant ne pas y travailler et laisser son écriture à quelqu'un d'autre. Le packaging est une étape cruciale dans le développement d'un projet; c'est cette étape qui assurera la diffusion et la reconnaissance de votre travail. Vous avez la responsabilité de faire fonctionner votre programme chez les gens sans pourrir leur système.

Le parallèle peut aisément être fait avec les dépôts des grandes distributions Linux/GNU comme Debian. L'intégrité des paquets est assurée par le respect de chartes strictes, et par le contrôle de nombreuses personnes (Pour Debian, un auteur est en relation avec des personnes appartenant à une hiérarchie rigoureuse (auteurs, responsables, parrains, mentors, développeurs Debian, responsables Debian). Voir le Guide du nouveau responsable Debian, et la Charte Debian des logiciels écrits en Python.

« fabricando fit faber » (c'est en forgeant que l'on devient forgeron).

Références