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] <COMMAND>
...

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 :

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) :

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 ;