Installer des bibliothèques avec pip et venv

Temps de lecture15 min

En bref

Résumé de l’article

La bibliothèque standard de Python ne couvre pas tous les besoins : dès que vous faites du calcul scientifique, du tracé de courbes ou du traitement de données, vous installez des bibliothèques écrites par d’autres. Cet article présente l’outil qui les installe, pip, et le dépôt où il va les chercher, PyPI.

Il explique surtout pourquoi on ne les installe jamais au niveau de la machine mais dans un environnement isolé, propre à chaque projet : parce que deux projets peuvent avoir besoin de deux versions incompatibles de la même bibliothèque. Vous verrez comment créer un tel environnement avec le module venv, ce que veut dire « activer » un environnement, et comment retrouver la liste exacte de ce qui y est installé.

Ces outils sont ceux de l’écosystème historique. Ils restent indispensables à connaître, car vous les rencontrerez partout, mais la gestion moderne de projet avec uv automatise tout ce qui est décrit ici.

Points clés à retenir

  • Un module est un fichier, un paquet est un ensemble de modules organisés en dossiers. La bibliothèque standard en fournit beaucoup ; PyPI en fournit des centaines de milliers d’autres.
  • pip est l’installateur de paquets de Python. On l’invoque de préférence par python -m pip, ce qui garantit qu’il installe pour l’interpréteur que l’on croit.
  • Installer une bibliothèque pour toute la machine est une mauvaise pratique, et les versions récentes de Python le refusent d’ailleurs. Deux projets peuvent exiger deux versions incompatibles d’une même bibliothèque.
  • Un environnement virtuel est un dossier contenant un interpréteur et ses paquets, isolé du reste du système. Un environnement par projet.
  • « Activer » un environnement configure simplement votre terminal pour que python et pip désignent ceux de l’environnement. C’est l’étape qu’on oublie, et la cause principale des erreurs ModuleNotFoundError.

Contenu de l’article

Modules, paquets et bibliothèque standard

Vous avez déjà écrit des programmes qui utilisent du code que vous n’avez pas écrit. Par exemple, pour afficher la date du jour, il est hors de question de mettre à jour le programme chaque matin :

from datetime import date

print("Hello, today's date is", date.today())

La première ligne indique que la classe date du module datetime sera utilisée. Cette classe et ses méthodes sont définies dans un fichier datetime.py que l’interpréteur sait trouver, parce qu’il a été installé en même temps que lui.

De nombreux autres modules ont également été installés : ils constituent la bibliothèque standard Python. Cependant, selon votre domaine (traitement du signal, sciences des données…), cette bibliothèque peut ne pas offrir certaines fonctionnalités spécifiques. C’est pourquoi des modules ou paquets externes existent pour offrir des fonctionnalités supplémentaires au/à la développeur(se).

Information

En Python, les modules et les paquets organisent et structurent le code, mais ont des objectifs différents.

En termes simples, un module est un fichier unique contenant du code Python, tandis qu’un paquet est un ensemble de modules organisés selon une hiérarchie de répertoires.

Si vous avez déjà créé un programme en Python, vous avez certainement déjà rencontré différents paquets Python tels que numpy, pandas, matplotlib, seaborn et des modules Python tels que math, random, sys, datetime

Où trouver des bibliothèques : PyPI

PyPI (Python Package Index) est le dépôt de logiciels du langage Python. PyPI vous aide à trouver et installer les logiciels développés et partagés par la communauté Python, et c’est là que l’installateur pip va chercher ce que vous lui demandez.

Attention

Avant d’installer tout paquet, vérifiez le contenu de la page de description du projet dans le dépôt PyPI car vous y trouverez des informations pertinentes sur le paquet (fonctionnalités) et sur la manière correcte de l’utiliser (versions compatibles de l’interpréteur Python, dépendances ou contraintes spécifiques, bibliothèques externes supplémentaires à installer pour obtenir des fonctionnalités supplémentaires…).

Méfiez-vous également des noms approchants : installer numpi au lieu de numpy est une technique d’attaque courante, appelée typosquatting.

pip, l’installateur de paquets

L’outil le plus populaire pour installer des paquets Python, et celui inclus dans les versions modernes de Python, est pip (Package Installer for Python). Il est normalement installé avec l’interpréteur ; vous pouvez le vérifier :

python -m pip --version
python -m pip --version
python3 -m pip --version
python3 -m pip --version

Remarquez la forme employée : python -m pip plutôt que pip tout court. Les deux fonctionnent le plus souvent, mais la première est plus sûre. Elle demande explicitement à cet interpréteur-là d’exécuter son propre pip, donc d’installer les paquets là où cet interpréteur les cherchera. Avec pip seul, rien ne garantit que l’outil trouvé dans le PATH corresponde à l’interpréteur que vous utilisez.

Pour connaître la liste des paquets disponibles dans l’environnement courant, ce qui est utile pour reconstruire cet environnement ailleurs (changement de machine, déploiement…) :

python -m pip list
python -m pip list
python3 -m pip list
python3 -m pip list

Pourquoi un environnement virtuel ?

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. 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 : installer la version 1.0 ou 2.0 laisse une des deux applications incapable de fonctionner.

Installer des paquets à un niveau global impacte de plus les exécutions de tous les programmes Python de la machine, y compris ceux que vous n’avez pas développés – et dont certains font partie du système d’exploitation. Pour cette raison, les versions récentes de Python refusent purement et simplement l’installation globale d’un paquet et vous renvoient une erreur externally-managed-environment.

La solution est de créer, pour chaque projet, un environnement virtuel : un dossier qui contient son propre interpréteur et ses propres paquets, isolé de l’existant sur votre machine. Cette technique vous permet de garder le contrôle des paquets installés, y compris de leurs numéros de version ; cette connaissance est cruciale si vous devez déployer votre programme, ou tout simplement l’exécuter, sur une autre machine.

Créer et activer un environnement virtuel avec venv

Le module venv, fourni avec Python, crée et gère ces environnements. On se place dans le dossier du projet, puis on demande la création d’un environnement – appelé ici env1 :

mkdir mon_projet
cd mon_projet
python -m venv env1
New-Item -Name "mon_projet" -ItemType Directory
cd mon_projet
python -m venv env1
mkdir mon_projet
cd mon_projet
python3 -m venv env1
mkdir mon_projet
cd mon_projet
python3 -m venv env1

Un dossier env1 apparaît, contenant une copie de l’interpréteur Python et les emplacements où seront rangés les paquets. À ce stade l’environnement existe, mais il n’est pas encore activé : le python de votre terminal est toujours celui du système.

L’activation consiste à exécuter un script fourni dans l’environnement :

env1\Scripts\activate
env1\Scripts\Activate.ps1
Information

Powershell n’autorise pas l’exécution de scripts non validés par un organisme de confiance. Il vous faudra donc reduire la sévérité de la politique d’exécution :

set-executionpolicy remotesigned
source env1/bin/activate
source env1/bin/activate
Information

Activer un environnement virtuel :

  • change le prompt de votre ligne de commande pour afficher le nom de l’environnement virtuel que vous utilisez,
  • fait que python et pip désignent désormais ceux de l’environnement, dont la version peut être différente de celle installée globalement,
  • rend disponibles les paquets spécifiques installés dans cet environnement.

Rien de tout cela n’est magique : le script d’activation ne fait que modifier des variables d’environnement de votre terminal, au premier rang desquelles le PATH. C’est pourquoi l’activation ne vaut que pour le terminal dans lequel vous l’avez lancée : un nouvel onglet, une nouvelle fenêtre ou un redémarrage repart de zéro. Pour vérifier l’effet, comparez la sortie de import sys; print(sys.executable); print(sys.path) avant et après activation.

Pour revenir à l’environnement global, tapez simplement deactivate.

Installer des paquets dans l’environnement

L’environnement étant activé, les paquets dont vous avez besoin seront installés localement, sans perturber le reste de votre ordinateur.

Supposons que nous voulions tracer une courbe. Quelques recherches sur PyPI désignent le paquet matplotlib comme tout à fait adapté :

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel("some numbers")
plt.ylabel("square values")
plt.show()

Exécuté tel quel dans un environnement neuf, ce script échoue sur un ModuleNotFoundError: No module named 'matplotlib' : la bibliothèque n’est pas encore là. On l’installe :

python -m pip install matplotlib
python -m pip install matplotlib
python3 -m pip install matplotlib
python3 -m pip install matplotlib

L’option -U (ou --upgrade) met à jour un paquet déjà installé. Une nouvelle exécution du script affiche à présent la fenêtre attendue :

Figure matplotlib

Pour plus d’informations sur l’utilisation de pip, consultez la documentation officielle sur l’installation de paquets.

Pour aller plus loin

Figer et rejouer un environnement avec requirements.txt

Un environnement virtuel n’est pas destiné à être partagé : il est volumineux et dépend du système d’exploitation. Ce que l’on partage, c’est la liste de ce qu’il contient, traditionnellement dans un fichier requirements.txt :

python -m pip freeze > requirements.txt
python -m pip freeze > requirements.txt
python3 -m pip freeze > requirements.txt
python3 -m pip freeze > requirements.txt

Sur une autre machine, ou dans un nouvel environnement, cette liste se rejoue en une commande :

python -m pip install -r requirements.txt
python -m pip install -r requirements.txt
python3 -m pip install -r requirements.txt
python3 -m pip install -r requirements.txt

Attention toutefois : pip freeze capture tout ce qui est installé dans l’environnement courant, y compris les dépendances indirectes et ce qui est spécifique à votre machine. Ce n’est donc pas exactement la liste des dépendances de votre projet. Pour cela, soit vous rédigez requirements.txt à la main, parce que vous savez ce dont votre code a besoin, soit vous utilisez un outil comme pipreqs qui analyse le code d’un répertoire pour le déduire :

python -m pip install pipreqs
pipreqs .
python -m pip install pipreqs
pipreqs .
python3 -m pip install pipreqs
pipreqs .
python3 -m pip install pipreqs
pipreqs .

Plusieurs environnements pour un même dossier

Rien n’empêche de créer plusieurs environnements virtuels côte à côte, par exemple env_312 et env_313, pour vérifier que votre code fonctionne avec deux versions de Python. Il suffit d’activer celui dont vous avez besoin. C’est un moyen simple de tester la compatibilité de votre programme avant de l’annoncer.