12. Environnements virtuels et paquets

12.1. Introduction

Les programmes Python utilisent souvent des paquets et modules qui ne font pas partie de la bibliothèque standard. Ils nécessitent aussi, parfois, une version spécifique d’une bibliothèque, par exemple parce qu’un certain bug a été corrigé ou encore que le programme a été implémenté en utilisant une version obsolète de l’interface de cette bibliothèque.

Cela signifie qu’il n’est pas toujours possible, pour une installation unique de Python, de couvrir tous les besoins de toutes les applications. Basiquement, si une application A dépend de la version 1.0 d’un module et qu’une application B dépend de la version 2.0, ces dépendances entrent en conflit et installer la version 1.0 ou 2.0 laisse une des deux applications incapable de fonctionner.

La solution est de créer un environnement virtuel, un dossier auto-suffisant qui contient une installation de Python pour une version particulière de Python ainsi que des paquets additionnels.

Différentes applications peuvent alors utiliser des environnements virtuels différents. Pour résoudre l’exemple précédent où il existe un conflit de dépendances, l’application A a son environnement virtuel avec la version 1.0 installée pendant que l’application B a un autre environnement virtuel avec la version 2.0. Si l’application B requiert que la bibliothèque soit mise à jour à la version 3.0, cela n’affecte pas l’environnement de A.

12.2. Création d’environnements virtuels

Le module utilisé pour créer et gérer des environnements virtuels s’appelle venv. venv installe en général la version de Python la plus récente dont vous disposez. Si plusieurs versions de Python sont sur votre système, vous pouvez choisir une version particulière en exécutant python3.X où X indique la version de votre choix.

Pour créer un environnement virtuel, décidez d’un dossier où vous voulez le placer et exécutez le module venv comme un script avec le chemin du dossier :

python3 -m venv tutorial-env

Cela crée le dossier tutorial-env (s’il n’existe pas) et des sous-dossiers contenant une copie de l’interpréteur Python, de la bibliothèque standard et quelques autres fichiers utiles.

Une fois l’environnement virtuel créé, vous pouvez l’activer.

Sur Windows, lancez :

tutorial-env\Scripts\activate.bat

Sur Unix et MacOS, lancez :

source tutorial-env/bin/activate

NB : ce script est écrit pour le shell bash. Si vous utilisez csh ou fish, utilisez les variantes activate.csh ou activate.fish.

Activer l’environnement virtuel change le prompt de votre ligne de commande pour afficher le nom de l’environnement virtuel que vous utilisez. Cela modifie aussi l’environnement afin, lorsque vous tapez``python``, d’exécuter la version spécifique de Python installée dans l’environnement. Par exemple :

$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>

12.3. Gestion des paquets avec pip

Vous pouvez installer, mettre à jour et supprimer des paquets en utilisant un programme appelé pip. Par défaut, pip installe les paquets du Python Package Index, <https://pypi.org>. Vous pouvez parcourir le Python Package Index avec un navigateur ou utiliser la fonction de recherche (assez) limitée de pip :

(tutorial-env) $ pip search astronomy
skyfield               - Elegant astronomy for Python
gary                   - Galactic astronomy and gravitational dynamics.
novas                  - The United States Naval Observatory NOVAS astronomy library
astroobs               - Provides astronomy ephemeris to plan telescope observations
PyAstronomy            - A collection of astronomy related tools for Python.
...

pip a plusieurs sous-commandes : « search », « install »,  » uninstall », « freeze », etc. Consultez le guide L’installation de modules Python pour une documentation exhaustive sur pip.

Vous pouvez installer la dernière version d’un paquet en indiquant son nom :

(tutorial-env) $ pip install novas
Collecting novas
  Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
  Running setup.py install for novas
Successfully installed novas-3.1.1.3

Vous pouvez installer une version spécifique d’un paquet en donnant le nom du paquet suivi de == et du numéro de version souhaitée :

(tutorial-env) $ pip install requests==2.6.0
Collecting requests==2.6.0
  Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0

Si vous relancez cette commande, pip remarque que la version demandée est déjà installée et ne fait rien. Vous pouvez fournir un numéro de version différent pour récupérer cette version ou lancer pip install --upgrade pour mettre à jour le paquet à la dernière version :

(tutorial-env) $ pip install --upgrade requests
Collecting requests
Installing collected packages: requests
  Found existing installation: requests 2.6.0
    Uninstalling requests-2.6.0:
      Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0

pip uninstall suivi d’un ou plusieurs noms de paquets les supprime de votre environnement virtuel.

pip show affiche des informations à propos d’un paquet précis :

(tutorial-env) $ pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:

pip list liste tous les paquets installés dans l’environnement virtuel :

(tutorial-env) $ pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)

pip freeze produit une liste similaire des paquets installés mais l’affichage adopte un format que pip install peut lire. La convention habituelle est de mettre cette liste dans un fichier requirements.txt :

(tutorial-env) $ pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0

Le fichier requirements.txt peut alors être ajouté dans un système de gestion de versions comme faisant partie de votre application. Les utilisateurs peuvent alors installer tous les paquets nécessaires à l’application avec install -r :

(tutorial-env) $ pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
  ...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
  ...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
  ...
Installing collected packages: novas, numpy, requests
  Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0

pip reconnait beaucoup d’autres options, documentées dans le guide L’installation de modules Python. Lorsque vous avez écrit un paquet, si vous voulez le rendre disponible sur PyPI, lisez le guide Distribuer des modules Python.