Licence CC BY-SA

Installer des modules complémentaires

La bibliothèque standard de Python a beau être très complète (voici par exemple la liste de tous ses modules), elle ne couvre pas tous les usages possibles.

Il est ainsi parfois nécessaire, quand on développe un programme, de réutiliser le code de quelqu’un d’autre, de faire appel à une bibliothèque logicielle externe.
Généralement cette bibliothèque prendra la forme d’un paquet Python, que l’on pourra installer pour le rendre disponible comme tout autre module. Il nous suffira alors de l’importer depuis notre code pour pouvoir l’utiliser.

Voyons donc maintenant comment installer de tels modules complémentaires.

Installation

Il existe plusieurs manières d’installer des modules complémentaires en Python.

D’abord, ils peuvent être installés au niveau du système d’exploitation, notamment si celui-ci met à disposition un gestionnaire de paquets. Sous Ubuntu on trouve ainsi un paquet python3-numpy dans apt pour installer la bilbiothèque Python numpy par exemple.
Sous Windows, on trouvera parfois des fichiers .exe permettant d’installer des modules particuliers.

Ces installations se font au niveau du système, les bibliothèques deviennent alors disponibles depuis n’importe où sur l’ordinateur.

On trouve aussi des suites logicielles, telles que Anaconda (voir ce tutoriel sur Zeste de Savoir), qui viennent directement avec un ensemble de paquets tiers pour un usage particulier (ici des bibliothèques dédiées au calcul scientifique) et ainsi en simplifier l’installation.

Mais ces solutions sont assez dépendantes du système utilisé, et il devient difficile de simplement dire « mon code a besoin du module potjevleesch pour fonctionner » si son installation est différente sur chaque machine.

Heureusement, Python fournit un outil pour simplifier et unifier tout cela : pip !

Pip, le gestionnaire de paquets Python

Pip est un gestionnaire de paquets spécialement dédié à l’installation de modules complémentaires pour Python. Il est normalement inclus dans toute installation récente de Python. Vous pouvez vous en assurer en essayant d’exécuter la commande python -m pip (ou python3 -m pip, voire py -m pip sur Windows) depuis un terminal (pas depuis une console Python).

Si toutefois ce n’était pas le cas, regardez si un paquet python-pip ou python3-pip existe dans le gestionnaire de paquets de votre système que vous pourriez installer.
Sinon, vous pouvez exécuter la commande python3 -m ensurepip --default-pip (py -m ensurepip --default-pip sous Windows) pour demander à Python d’installer le nécessaire.

Pip peut donc être invoqué via la commande shell python -m pip (py -m pip sous Windows), ou par le simple raccourci pip.

L’outil comprend plusieurs commandes, notamment la commande install pour installer un paquet, suivie du nom du paquet à installer. Ce nom sera généralement inscrit sur les sites officiels des bibliothèques que vous souhaitez installer.

% pip install Pillow
Collecting Pillow
  Downloading Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB)
     |████████████████████████████████| 4.3 MB 1.7 MB/s 
Installing collected packages: Pillow
Successfully installed Pillow-9.0.1

Le paquet sera alors installé par défaut pour l’utilisateur courant (ou pour tout le système si la commande est exécutée avec les droits d’administration).

Attention aux paquets frauduleux. Il peut arriver que certains paquets imitent le nom de paquets connus pour diffuser du code malicieux. Assurez-vous donc de toujours utiliser le nom clairement défini sur le site officiel.

Il est aussi possible de spécifier une version précise du paquet à l’aide de la syntaxe paquet==version, par exemple pip install Pillow==9.0.1. C’est la méthode conseillée dans votre répertoire de travail pour être sûr de la version utilisée.
On peut même préciser plusieurs noms de paquets à installer derrière pip install.

pip install accepte aussi une option -r suivie d’un nom de fichier, ce fichier devant contenir les dépendances à installer dans une syntaxe comprise par pip install :

Pillow==9.0.1
pyglet
requirements.txt
% pip install -r requirements.txt
Collecting Pillow
  Using cached Pillow-9.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB)
Collecting pyglet==1.5.22
  Downloading pyglet-1.5.22-py3-none-any.whl (1.1 MB)
     |████████████████████████████████| 1.1 MB 2.8 MB/s 
Installing collected packages: pyglet, Pillow
Successfully installed Pillow-9.0.1 pyglet-1.5.22

À l’inverse, on peut supprimer un paquet installé à l’aide de la commande uninstall. La désisntallation demandera une confirmation (y) pour supprimer le paquet.

% pip uninstall Pillow
Found existing installation: Pillow 9.0.1
Uninstalling Pillow-9.0.1:
  Would remove:
    ...
Proceed (Y/n)? y
  Successfully uninstalled Pillow-9.0.1

Il est aussi possible de lister les paquets installés avec pip list.

% pip list
Package    Version
---------- -------
Pillow     9.0.1
pip        21.2.4
pyglet     1.5.22
setuptools 58.1.0

pip freeze permet quant à lui d’extraire la liste des paquets installés dans une syntaxe comprise par pip install.

% pip freeze
Pillow==9.0.1
pyglet==1.5.22

Il est ainsi courant d’utiliser la liste renvoyée par pip freeze pour former un fichier requirements.txt qui pourra ensuite permettre de réinstaller à l’identique ces mêmes dépendances dans un autre environnement à l’aide d’un pip install -r requirements.txt.
Cela permet d’avoir un environnement reproductible d’une machine à l’autre.

Par défaut, pip fait appel à l’index PyPI (Python Package Index) pour trouver les paquets à installer, c’est le dépôt officiel des paquets Python, qui peut être consulté à cette URL : https://pypi.org/.

Il est possible sur le site de faire des recherches sur l’index ou d’explorer les projets pour retrouver des paquets. Chaque paquet vient avec une page de description et un ensemble de métadonnées. Voici par exemple la page du paquet Pillow.


Pour plus d’informations au sujet de Pip, vous pouvez vous reporter au guide officiel.

Environnements virtuels

En utilisant Pip comme nous venons de le faire, les paquets sont installés au niveau du système ou de l’utilisateur. C’est accommodant parce que le paquet est alors disponible partout et utilisable par tous les projets, mais cela peut parfois poser problème.

En effet, une seule version d’un paquet peut être disponible à la fois, ce qui fait que tous les projets doivent partager cette même version. Impossible alors pour un projet de bénéficier des évolutions récentes d’un module complémentaire si un autre projet dépend d’une version plus ancienne.

Pour résoudre ce problème, on va chercher à cloisonner nos applications, afin qu’elles gardent leurs dépendances (les modules complémentaires qu’elles doivent installer) auprès d’elles plutôt que de les installer sur tout le système. Et cela se fait à l’aide des environnements virtuels.

Un environnement virtuel n’est ni plus ni moins qu’un répertoire cloisonné de bibliothèques Python. On peut donc avoir autant d’environnements virtuels que l’on veut sur le système, qui contiendront chacun leurs bibliothèques dans les versions qu’ils veulent.
Mais bien sûr, dans un même environnement, une bibliothèque ne pourra être installée qu’en un seul exemplaire (donc une seule version).

Pour créer un nouvel environnement, on utilise la commande shell python -m venv suivie d’un nom, souvent env ou venv. Ce nom correspond au nom du répertoire qui sera créé pour l’environnement, depuis le répertoire courant donc.
On fera en sorte d’utiliser le répertoire du projet comme répertoire courant.

% python -m venv env

Cette commande a donc créé un dossier env dans le répertoire courant. Pour l’instant cet environnement est juste créé, mais pour l’utiliser nous devons l’activer.

Cela se fait à l’aide de la commande source XXX/bin/activate sous Linux/Mac ou XXX\\Scripts\\Activate.ps1 sous Windows. Avec XXX remplacé par le nom du répertoire de l’environnement, env dans notre cas.

% source env/bin/activate
(env) % 

On voit que le prompt de notre shell est maintenant préfixé d’un (env) pour signifier que nous sommes à l’intérieur de l’environnement.

Toutes les commandes que nous exécuterons maintenant (notamment les pip install) le seront à l’intérieur de cet environnement et n’affecteront pas le reste du système.

Il est nécessaire d’activer l’environnement virtuel chaque fois que vous ouvrez un nouveau terminal pour pouvoir l’utiliser.

Une fois votre travail terminé, si vous souhaitez sortir de l’environnement virtuel, vous pouvez utiliser la commande deactivate.

(env) % deactivate
%

Vous pouvez consulter la page de documentation du module venv pour de plus amples informations à son sujet.