.. _python-30-environnement-python-reproductible: ***************************************** Un environnement de travail reproductible ***************************************** La reproductibilité est un élément majeur de la science des données. Elle consiste à pouvoir reproduire les résultats d'une analyse de données, même si l'environnement logiciel dans lequel elle a été réalisée change. L'environnement logiciel d'un projet de science des données est constitué d'un système d'exploitation, de l'interpréteur Python et des bibliothèques associées. Il est donc nécessaire de pouvoir reproduire cet environnement pour garantir la reproductibilité des résultats. Le système d'exploitation ========================= Le système d'exploitation de référence est Linux. Plusieurs solutions sont possibles pour utiliser Linux : - Installer Linux sur votre machine locale; - Installer un guest Linux dans une `machine virtuelle `_ sur un hôte Windows ou macOS. ; - Activer le sous-système Linux pour Windows (`WSL `_) sur un hôte Windows ; - Utiliser un `conteneur Docker `_ qui embarque un environnement Linux ; - Utiliser un service cloud qui propose un environnement Linux. Le langage Python ================= Python est un langage "OS agnostic", c'est-à-dire qu'il peut être exécuté sur n'importe quel système d'exploitation puisqu'il abstrait les interfaces système. Cependant, il est nécessaire de pouvoir gérer les différentes versions. Les distributions Linux incluent généralement une version de Python 3, mais elle peut ne pas être la plus récente. C'est une très mauvaise idée de remplacer la version de Python fournie par la distribution, les applications existantes en dépendent et peuvent être affectées. La meilleure approche est d'installer côte à côte différentes versions de Python et d'y faire référence, au travers d'un environnement virtuel, pour chaque projet. Les bibliothèques ================= Les bibliothèques sont des composants logiciels qui permettent d'ajouter des fonctionnalités au langage de base. Elles sont nécessaires pour réaliser des tâches spécifiques, comme l'analyse de données, la visualisation, ou encore le machine learning. C'est la plus grande difficulté pour garantir la reproductibilité des résultats, car les bibliothèques évoluent rapidement et peuvent introduire des changements qui affectent les résultats d'une analyse de données. Il est donc nécessaire de pouvoir figer les versions. Le problème intervient lorsqu'on utilise des bibliothèques qui dépendent d'autres bibliothèques, qui elles-mêmes dépendent d'autres bibliothèques... Il est donc nécessaire de pouvoir gérer les dépendances et les versions des bibliothèques utilisées. Cette gestion des dépendances ne peut pas se faire au niveau du système d'exploitation, car deux projets différents peuvent nécessiter des versions différentes d'une même bibliothèque. Il est donc nécessaire de pouvoir créer des environnements isolés pour chaque projet. ``uv`` un gestionnaire de projets Python ======================================== Pour créer un environnement isolé pour chaque projet, on crée un environnement virtuel dans laquelle on installe la version de Python requise, ainsi que les bibliothèques nécessaires. Une solution moderne et performante pour réaliser ces tâches consiste à utiliser `uv `_. Installation ------------ Dans un environnement Linux on installe ``uv`` avec la commande suivante :: $ curl -LsSf https://astral.sh/uv/install.sh | sh $ uv An extremely fast Python package manager. Usage: uv [OPTIONS] ... Workflow -------- Dans le répertoire ``my_project``, créer l'arborescence de base :: [my_project] $ uv init Initialized project `my_project` [my_project] $ ls -la total 20 drwxr-xr-x 2 user user 4096 Sep 4 15:12 . drwxr-xr-x 7 user user 4096 Sep 4 15:12 .. -rw-r--r-- 1 user user 5 Sep 4 15:12 .python-version -rw-r--r-- 1 user user 0 Sep 4 15:12 README.md -rw-r--r-- 1 user user 84 Sep 4 15:12 main.py -rw-r--r-- 1 user user 152 Sep 4 15:12 pyproject.toml Créer l'environnement virtuel :: [my_project] $ uv sync Using CPython 3.14.6 Creating virtual environment at: .venv Resolved 1 package in 73ms Checked in 0.47ms Installer la version de Python requise :: [my_project] $ uv install 3.11.4 Installing Python 3.11.4... Python 3.11.4 installed successfully. [my_project] $ uv use 3.11.4 Using Python 3.11.4 for project `my_project` Ajouter une bibliothèque à l'environnement virtuel :: [my_project] $ uv add requests Resolved 6 packages in 355ms Prepared 5 packages in 134ms Installed 5 packages in 54ms + certifi==2026.7.22 + charset-normalizer==3.5.1 + idna==3.19 + requests==2.34.2 + urllib3==2.7.0 La dépendance est ajoutée aux fichiers ``pyproject.toml`` et ``uv.lock`` :: [my_project] $ ls -la total 28 drwxr-xr-x 3 courivad courivad 4096 Sep 4 15:14 . drwxr-xr-x 7 courivad courivad 4096 Sep 4 15:12 .. -rw-r--r-- 1 courivad courivad 5 Sep 4 15:12 .python-version drwxr-xr-x 4 courivad courivad 4096 Sep 4 15:14 .venv -rw-r--r-- 1 courivad courivad 0 Sep 4 15:12 README.md -rw-r--r-- 1 courivad courivad 84 Sep 4 15:12 main.py -rw-r--r-- 1 courivad courivad 152 Sep 4 15:12 pyproject.toml -rw-r--r-- 1 courivad courivad 126 Sep 4 15:14 uv.lock [my_project] $ cat pyproject.toml [project] name = "my_project" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = "=3.11.4" dependencies = [ "requests>=2.34.2", ] [my_project] $ head -12 uv.lock version = 1 revision = 3 requires-python = "=3.11.4" [[package]] name = "certifi" version = "2026.7.22" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, ] .. note:: Tous les fichiers de configuration doivent être versionnés dans le dépôt Git du projet, ce qui permet de reproduire l'environnement logiciel sur n'importe quelle machine. Le répertoire ``.venv`` ne doit pas être versionné, car il est spécifique à chaque machine et peut être recréé à partir des fichiers de configuration. Il doit être ajouté au fichier ``.gitignore`` du projet. Exemple concret --------------- Pour vérifier le fonctionnement correct du workflow, insérer le code suivant dans ``main.py`` : .. code-block:: python import requests def main(): r = requests.get('https://www.esiee.fr') print(r.status_code, r.url, len(r.content)) if __name__ == "__main__": main() et lancer l'exécution du projet dans son environnement isolé :: [my_project] $ uv run main.py 200 https://www.esiee.fr/ 98970 VS Code ======= L'IDE `VS Code `_ est un excellent outil pour développer en Python. Quelques extensions pour bénéficier de fonctionnalités avancées (liste non limitative) : - `Python `_ - `Pylance `_ - `GitLens `_ Git === Git est un système de gestion de versions décentralisé qui permet de suivre l'évolution d'un projet et de collaborer avec d'autres développeurs. Il est essentiel pour garantir la reproductibilité des résultats, car il permet de versionner les fichiers de configuration de l'environnement logiciel. Les principales commandes : - `git init `_ : initialiser un dépôt Git dans le répertoire du projet ; - `git add `_ : ajouter des fichiers au suivi de version ; - `git commit `_ : enregistrer les modifications dans l'historique du projet ; - `git push `_ : envoyer les modifications vers un dépôt distant ; - `git pull `_ : récupérer les modifications depuis un dépôt distant ; - ...