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 de la bibliothèque, nécessitant par exemple qu’un certain bug ai été corrigé, ou encore que le programme à été implémenté en utilisant une version obsolète de l’interface de la bibliothèque.

Cela signifie qu’il n’est pas forcément possible, pour une installation 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, il y a conflit, et installer la version 1.0 ou 2.0 laissera une des deux application incapable de fonctionner.

La solution à ce problème 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 additionels.

Différentes applications peuvent alors utiliser des environnements virtuels différents. Pour résoudre l’exemple précédents de dépendances, l’application A aura son problème environnement virtuel avec la version 1.0 installée, pendant que l’application B aura 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, ça n’affectera pas l’environnement de A.

12.2. Création d’Environnements Virtuels

Le module utilisé pour créer et gérer des environnements virtuels est appellé venv. venv installera en général la version de Python la plus récente qui vous est disponible. Si plusieurs versions de Python sont sur votre système, vous pouvez choisir une version particulière en exécutant python3 ou 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éera 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 que vous avez créé un environnement virtual, vous pouvez l’activer.

Sur windows, lancez :

tutorial-env\Scripts\activate.bat

Sur Unix et MacOS, lancez :

source tutorial-env/bin/activate

(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 changera le prompt de votre ligne de commande pour afficher quel environnement virtuel vous utilisez, et modifie l’environnement pour qu’exécuter python vous donner 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. Gérer les Paquets avec pip

Vous pouvez installer, mettre à jour, et supprimer des paquets en utilisant un programme appelé pip. Par défaut, pip installera des paquets du Python Package Index, <https://pypi.python.org/pypi>. Vous pouvez parcourir le Python Package Index avec un navigateur, ou vous pouvez utiliser la fonctionnalité de recherche 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 contenant 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 :

(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 re-lancez cette commande, pip remarquera que la version demandée est déjà installée et ne fera 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 supprimera de votre virtualenv.

pip show affichera 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 listera 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 produira une liste similaire de paquets installés, mais l’affichage suivra un format que pip install pourra lire. Une 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 version comme faisant partie de votre application. Les utilisateurs pourront alors installer tous les paquets nécessaires 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 a beaucoup d’autres options, documentées dans le guide L’installation de modules Python. Lorsque vous aurez écrit un paquet, si vous voulez le rendre disponible sur PyPI, lisez le guide Distribuer des Modules Python.