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 à ce problème est de créer un environnement virtuel (souvent aérienne appelé « virtualenv »), une arborescence de dossiers contenant une installation de Python autonome, d’une certaine version de Python, avec des paquets additionnels.

Différents programmes peuvent utiliser différents environnements virtuels. Pour résoudre le conflit précédent (des dépendances conflictuelles) l’application A peut avoir son propre environnement virtuel, avec la version 1.0 du module installée, pendant que l’application B à un autre environnement virtuel avec la version 2.0. Si l’application B nécessite une mise à jour de la bibliothèque en version 3.0, ça n’affectera toujours pas l’application A.

12.2. Création d’environnements virtuels

Le script utilisé pour créer et gérer des environnements virtuels est appelé pyvenv. pyvenv installe habituellement la version la plus récente de Python. Il existe aussi suffixé d’un numéro de version, de manière à pourvoir choisir la version de pyvenv ex exécutant par exemple pyvenv-3.4 (ou n’importe quelle autre version).

Pour créer un virtualenv, appelez le programme pyvenv avec en paramètre le nom du dossier dans lequel vous voulez l’installer :

pyvenv 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 le virtualenv créé, vous devez l’activer.

Sur Windows, lancez :

tutorial-env/Scripts/activate

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 un virtualenv change votre invite shell pour vous indiquer quel virtualenv vous utilisez, et change votre environnement de manière à ce qu’en lançant python, votre shell trouve le Python de votre virtualenv. Par exemple :

-> source ~/envs/tutorial-env/bin/activate
(tutorial-env) -> python
Python 3.4.3+ (3.4:c7b9645a6f35+, May 22 2015, 09:31:25)
  ...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python34.zip', ...,
'~/envs/tutorial-env/lib/python3.4/site-packages']
>>>

12.3. Gestion des paquets avec pip

Une fois un virtualenv activé, vous pouvez installer, mettre à jour, ou supprimer des paquets via un programme nommé pip. Par défaut pip installe ses paquets depuis le « Python Package Index », <https ://pypi.python.org/pypi>. Vous pouvez parcourir les paquets en allant sur PyPI avec votre navigateur, ou en utilisant la fonction de recherche, basique, 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 Installation de modules Python pour une documentation exhaustive sur pip.

Vous pouvez installer la dernière version d’un paquet simplement par son nom :

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

Il est aussi possible d’installer une version spécifique, en suffixant son nom de = et le numéro de version :

-> 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 vis exécutez cette commande à nouveau, pip ne fera rien : il sera conscient que la version demandée est déjà installée. Vous pouvez fournir un numéro de version différent, et ainsi obtenir le paquet à la version demandée, ou lancer pip install --upgrade pour mettre à jour le paquet vers sa version la plus récente :

-> 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 affichera des informations à propos d’un paquet donné :

(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 énumère les paquets installés dans l’environnement virtuel courant :

(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 aussi une liste de paquets installés, mais dans un format lisible par pip install. Il est coutumier de ranger cette liste dans un fichier nommé 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 être archivé dans le système de contrôle de version, et livré comme une pièce de l’application. Les utilisateurs pourront ainsi installer les paquets nécessaires avec install -r

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