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

This will create the tutorial-env directory if it doesn't exist, and also create directories inside it containing a copy of the Python interpreter and various supporting files.

Un répertoire habituel pour un environnement virtuel est .venv. Ce nom fait que le répertoire est généralement caché dans votre explorateur de fichiers, et donc non gênant, tout en lui donnant un nom qui explique pourquoi le répertoire existe. Il empêche également de rentrer en conflit avec les fichiers de définition de variable d'environnement .env que certains outils utilisent.

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

(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']
>>>

To deactivate a virtual environment, type:

deactivate

into the terminal.

12.3. Gestion des paquets avec pip

You can install, upgrade, and remove packages using a program called pip. By default pip will install packages from the Python Package Index, <https://pypi.org>. You can browse the Python Package Index by going to it in your web browser.

pip has a number of subcommands: "install", "uninstall", "freeze", etc. (Consult the Installation de modules Python guide for complete documentation for pip.)

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

(tutorial-env) $ python -m 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) $ python -m 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

If you re-run this command, pip will notice that the requested version is already installed and do nothing. You can supply a different version number to get that version, or you can run python -m pip install --upgrade to upgrade the package to the latest version:

(tutorial-env) $ python -m 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

python -m pip uninstall followed by one or more package names will remove the packages from the virtual environment.

python -m pip show will display information about a particular package:

(tutorial-env) $ python -m 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:

python -m pip list will display all of the packages installed in the virtual environment:

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

python -m pip freeze will produce a similar list of the installed packages, but the output uses the format that python -m pip install expects. A common convention is to put this list in a requirements.txt file:

(tutorial-env) $ python -m 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) $ python -m 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.