Web

Python versioning avec pip et virtualenv : mode d'emploi

Python versioning avec pip et virtualenv : mode d'emploi

Gérer les dépendances d'un projet Python sans méthode rigoureuse, c'est s'exposer à des conflits de versions qui peuvent bloquer une application entière. Le python versioning désigne précisément cette discipline : contrôler quelles versions de bibliothèques sont installées, dans quel environnement, et pour quel projet. Depuis l'essor de Python dans le développement web et scientifique à partir de 2010, deux outils se sont imposés comme références : pip pour gérer les paquets, et virtualenv pour isoler les environnements. Maîtriser leur combinaison permet d'éviter le scénario cauchemardesque du projet qui fonctionne sur un poste et plante sur un autre. Ce guide vous donne les clés concrètes pour mettre en place une gestion de versions propre, reproductible et professionnelle.

Comprendre pourquoi les versions de paquets posent problème

Un projet Python repose rarement sur le seul interpréteur. Il s'appuie sur des dizaines de bibliothèques tierces : Django, NumPy, Requests, et bien d'autres. Chacune de ces bibliothèques évolue dans le temps. Une mise à jour peut introduire des changements incompatibles avec votre code existant, ou pire, avec une autre bibliothèque que vous utilisez simultanément.

Le versioning, au sens strict, désigne la gestion des différentes versions d'un logiciel ou d'une bibliothèque. Dans l'écosystème Python, cela signifie spécifier explicitement quelle version de chaque paquet votre projet requiert. Sans cette précision, une simple commande pip install récupère toujours la dernière version disponible — ce qui peut casser un projet stable du jour au lendemain.

Prenons un exemple concret. Votre application utilise Flask 2.0. Un collègue installe Flask sur son poste sans préciser la version et récupère Flask 3.x, qui a modifié certaines API. Le projet ne démarre plus sur son environnement. Ce type de problème, fréquent dans les équipes, coûte un temps précieux en débogage inutile. La solution passe par une gestion explicite et documentée des versions, dès le départ.

La Python Software Foundation encourage depuis longtemps les bonnes pratiques en matière de gestion des dépendances. L'outillage disponible aujourd'hui rend cette rigueur accessible à tous les niveaux, du développeur débutant au mainteneur de projets complexes. Comprendre les mécanismes sous-jacents reste la première étape avant de manipuler les outils.

Installation et configuration de pip

Pip est le gestionnaire de paquets officiel de Python. Sa définition est simple : il permet d'installer, de mettre à jour et de supprimer des bibliothèques Python depuis le dépôt PyPI (Python Package Index). Depuis Python 3.4, pip est inclus par défaut dans toute installation standard de Python.

Vérifier que pip est disponible sur votre système ne prend que quelques secondes. Ouvrez un terminal et tapez pip --version ou pip3 --version selon votre configuration. Si pip n'est pas présent, l'installation se fait via le script officiel get-pip.py, téléchargeable depuis la documentation officielle de pip disponible sur pip.pypa.io.

Voici les étapes pour installer et configurer pip correctement :

  • Vérifier la version de Python installée avec python --version ou python3 --version
  • Télécharger le script d'installation get-pip.py depuis pip.pypa.io si pip est absent
  • Exécuter le script avec python get-pip.py dans le terminal
  • Mettre à jour pip vers sa dernière version avec python -m pip install --upgrade pip
  • Configurer un fichier pip.conf (Linux/macOS) ou pip.ini (Windows) pour personnaliser les options par défaut

Une fois pip opérationnel, prenez l'habitude de le maintenir à jour. Une version ancienne de pip peut refuser d'installer certains paquets récents ou mal interpréter les métadonnées de version. La commande de mise à jour s'exécute régulièrement, idéalement à chaque création d'environnement virtuel. La documentation officielle de Python sur docs.python.org détaille l'ensemble des options disponibles pour une configuration avancée.

Créer des environnements isolés avec virtualenv

Virtualenv résout un problème structurel : par défaut, pip installe les paquets de manière globale sur le système. Cela signifie que deux projets utilisant des versions différentes d'une même bibliothèque ne peuvent pas coexister sans conflit. Virtualenv crée un répertoire isolé contenant son propre interpréteur Python et ses propres paquets, totalement indépendant du système global.

L'installation de virtualenv passe par pip lui-même : pip install virtualenv. Une fois installé, créer un environnement virtuel pour un projet se fait en une seule commande : virtualenv nomduprojet. Cette commande génère un dossier contenant l'interpréteur Python, pip, et une structure de répertoires dédiée.

Activer l'environnement varie selon le système d'exploitation. Sous Linux et macOS, la commande est source nomduprojet/bin/activate. Sous Windows, on utilise nomduprojet\Scripts\activate. Une fois activé, le terminal affiche le nom de l'environnement entre parenthèses, confirmant que toutes les installations pip suivantes seront confinées à cet espace.

Python 3.3 a introduit le module venv, intégré directement dans la bibliothèque standard, qui offre des fonctionnalités similaires à virtualenv pour la plupart des cas d'usage courants. La commande est python -m venv nom_env. Virtualenv reste préférable dans les contextes où plusieurs versions de Python coexistent sur le même système, car il offre plus de flexibilité pour spécifier l'interpréteur à utiliser lors de la création de l'environnement.

Désactiver un environnement virtuel se fait simplement avec la commande deactivate. Supprimer un environnement revient à supprimer son dossier. Cette légèreté est un atout : expérimenter avec des configurations différentes ne laisse aucune trace sur le système hôte.

Gérer les versions de paquets avec pip

Installer un paquet sans préciser sa version, c'est laisser pip choisir à votre place. Pour un projet sérieux, cette approche ne tient pas. Pip permet de spécifier des versions précises ou des plages de versions grâce à des opérateurs standardisés. pip install requests==2.28.0 installe exactement la version 2.28.0. pip install requests>=2.25,<3.0 accepte toute version dans cette fourchette.

Le fichier requirements.txt centralise toutes ces spécifications. Il s'agit d'un simple fichier texte listant chaque dépendance avec sa version. La commande pip freeze > requirements.txt génère automatiquement ce fichier à partir des paquets installés dans l'environnement actif. N'importe quel développeur peut ensuite reproduire exactement le même environnement avec pip install -r requirements.txt.

Mettre à jour un paquet spécifique se fait avec pip install --upgrade nom_paquet. Vérifier les paquets obsolètes dans un environnement s'effectue via pip list --outdated, qui affiche la version installée et la version disponible pour chaque paquet concerné. Cette commande mérite d'être exécutée régulièrement, surtout pour les bibliothèques liées à la sécurité.

La communauté open source Python a développé des outils complémentaires comme pip-tools, qui distingue les dépendances directes des dépendances transitives. Avec pip-tools, on maintient un fichier requirements.in listant uniquement les dépendances directes du projet, et l'outil génère un requirements.txt complet et verrouillé incluant toutes les dépendances indirectes. Cette approche améliore la lisibilité et la maintenabilité sur le long terme.

Bonnes pratiques pour maintenir un projet Python dans la durée

Versionner ses dépendances ne suffit pas si le fichier requirements.txt n'est jamais mis à jour. La règle pratique : chaque modification de l'environnement virtuel doit être suivie d'une mise à jour du fichier de dépendances et d'un commit dans le système de contrôle de version (Git, par exemple). Cette discipline garantit que l'historique du projet reflète fidèlement son état à chaque étape.

Séparer les dépendances de production des dépendances de développement est une pratique que les développeurs Python expérimentés adoptent systématiquement. Un fichier requirements-dev.txt regroupe les outils comme pytest, black ou flake8, qui ne doivent pas se retrouver en production. Cette séparation allège les déploiements et réduit la surface d'attaque potentielle.

Fixer les versions de manière trop stricte crée un autre problème : les dépendances de sécurité ne peuvent plus être mises à jour facilement. L'approche équilibrée consiste à épingler les versions majeures tout en autorisant les mises à jour de correctifs. La notation ~=2.28.0 (compatible release) dans pip permet exactement cela : elle autorise les versions 2.28.x tout en bloquant le passage à 2.29.

Les outils modernes comme Poetry ou Pipenv encapsulent pip et virtualenv dans une interface unifiée avec gestion automatique du fichier de verrouillage. Ils ne remplacent pas la compréhension des mécanismes sous-jacents, mais accélèrent le flux de travail sur des projets de grande taille. Connaître pip et virtualenv en profondeur reste la base indispensable pour utiliser ces outils de manière éclairée et déboguer efficacement quand quelque chose se passe mal.

Documenter l'environnement Python requis dans le README du projet est souvent négligé. Préciser la version minimale de Python, les instructions d'installation de l'environnement virtuel et la commande pip install -r requirements.txt réduit drastiquement le temps d'onboarding pour un nouveau développeur. Une bonne gestion du python versioning se lit aussi dans la qualité de cette documentation.

La rédaction

La rédaction est composée d'auteurs spécialisés dans le numérique, qui publient régulièrement des articles d'information sur le web, le webmarketing et l'informatique. À propos