Camille Estève note les pesées de vendange d'un petit domaine viticole près de Mâcon dans un tableur, et veut un total par parcelle. Onze lignes, rien à installer, et ça affiche :
- A : 812 kg sur 3 pesées, médiane 270
- B : 340 kg sur 2 pesées, médiane 170.0
Le tout tient en quatre imports et une boucle. csv.DictReader donne un dict par ligne, avec les clés de l'en-tête, si bien que r["poids"] fonctionne sans compter les colonnes. Path("vendange.csv").open() remplace open() avec un chemin construit soi-même, et c'est celui qu'il faut apprendre, parce que le même objet joint, cherche par motif et vérifie l'existence. defaultdict(list) ajoute à une clé qui n'existe pas encore, ce qui retire la garde de deux lignes que tout le monde écrit en premier. Et f"{parcelle} : {sum(valeurs)} kg" évalue l'expression entre les accolades, calcul compris.
Une ligne fait un travail discret : if r["poids"] ignore la chaîne vide qu'une pesée manquante laisse derrière elle, parce qu'une cellule vide arrive d'un CSV comme "" et jamais comme None. La manquer arrête le programme avec int(""), ce qui est le plantage le plus courant sur un script comme celui-ci.
La sortie a un détail à remarquer. statistics.median de deux valeurs renvoie leur moyenne, donc le type devient un flottant, ce qui explique que la parcelle B affiche 170.0 et la parcelle A affiche 270. Rien n'est faux ; la fonction dit combien de pesées elle avait.
La bibliothèque est le langage, en pratique
Rien ci-dessus ne vient d'un paquet. csv, pathlib, statistics et collections sont livrés avec l'interpréteur, versionnés avec lui, et écrits pour être utilisés ensemble, ce qui fait de la dépendance externe le second geste plutôt que le premier. Les dates, le JSON, les requêtes HTTP, les fichiers zip, SQLite et un lanceur de tests sont tous là aux mêmes conditions. Savoir ce qui est déjà présent est la différence entre un script de onze lignes et un projet avec un fichier de dépendances.
La syntaxe en dessous est réellement petite : l'indentation porte les blocs, il n'y a ni accolades ni points-virgules, et un débutant lit une page de ce langage avant qu'on lui en enseigne quoi que ce soit. Cette lisibilité est la raison pour laquelle on le donne en premier, et c'est aussi la raison pour laquelle on sous-estime ce qui reste.
Ce qui reste, c'est l'environnement, et ça prend la plus grande partie de la quinzaine
Le script de Camille tourne. Le script de Camille tourne sur l'ordinateur de Camille. L'écart entre ces deux phrases est là que passe la seconde semaine, et rien de tout ça n'est du Python.
python3 -m venv .venv donne à un projet son propre interpréteur et ses paquets, ce qui est le seul geste qui empêche la mise à jour d'un projet de casser un autre. Sans ça, chaque installation est globale et chaque projet se dispute les mêmes versions. un fichier de verrouillage enregistre les versions exactes, et il se commite, parce qu'une liste de noms sans versions reproduit ce qui est le plus récent le jour où quelqu'un clone plutôt que ce que vous aviez.
Une ligne de plus appartient à tout fichier susceptible d'être importé : if __name__ == "__main__" protège le code qui ne doit pas s'exécuter à l'import. Un fichier sans elle fait son travail dès qu'on l'importe, et l'échec est déroutant, parce que l'import peut venir du lanceur de tests ou d'un pool de processus qui démarre un travailleur.
La seconde semaine
Ce qui doit tenir avant que le script tourne sur une autre machine
Chaque maillon porte toute la charge, et celui qui casse n'est jamais celui qu'on avait étudié.
- Le fichier sourceOnze lignes, et la seule partie qu'on enseigne jamais
- La version de l'interpréteurDeux versions de retard sur une machine que personne n'a mise à jour
- L'environnementUn venv, ou chaque projet se battant pour le même jeu de paquets
- Le fichier de verrouillageDes versions exactes, ou ce qui est le plus récent le jour du clonage
- Les bibliothèques propres à la machineCe qu'un paquet compilé exige discrètement, sans le dire
Le maillon faible est celui où le projet d'un débutant échoue vraiment, et c'est le seul qui ne coûte rien à corriger avant qu'il ne cède.
uv et Ruff, la version 2026
Python 3.14 est la version actuelle. uv, apparu en 2024, est l'outil à installer en premier : gratuit et open source, il a remplacé pip, virtualenv et pyenv, trois outils qui faisaient à eux trois un seul travail. Il installe la version d'interpréteur qu'un projet demande et écrit le fichier de verrouillage, ce qui est le paragraphe précédent résolu plutôt qu'expliqué.
Ruff est le formateur et l'analyseur, gratuit lui aussi, du même éditeur, et il a remplacé flake8, isort et black. Les deux tiennent en un seul binaire et aucun n'a besoin de son propre Python pour tourner, ce qui était le problème circulaire qui rendait les anciens outils pénibles à expliquer.
L'erreur : chercher un paquet avant d'ouvrir la bibliothèque
L'endroit où l'on cale sur ce langage n'est ni la syntaxe ni vraiment l'environnement. C'est que les problèmes d'environnement arrivent surtout comme la conséquence d'une dépendance, et cette dépendance n'était généralement pas nécessaire. Un script qui lit un tableur, additionne des nombres et affiche un résumé tient en onze lignes de bibliothèque standard ; la version qui commence par une bibliothèque de tableaux de données entraîne une dépendance compilée, une contrainte de version et une raison de se soucier de quel interpréteur est sur le chemin.
La règle qui ne coûte rien : avant d'installer quoi que ce soit, chercher une fois dans la bibliothèque standard. La réponse est non assez souvent pour garder l'habitude honnête, et oui assez souvent pour économiser la quinzaine. La première tentative de Camille commençait par un paquet de tableaux de données et une installation ratée, et les onze lignes ci-dessus sont ce qu'il restait après la seconde tentative.
La question sans réponse est ce à quoi sert Python une fois que le script doit répondre à quelqu'un d'autre, et elle se sépare en deux : la même bibliothèque standard tournée vers l'automatisation en Python, ou une requête qui arrive de l'extérieur, dans Python sur le web. Ce qu'il y a d'abord à connaître tient dans les bases de Python, ce que la bibliothèque standard offre déjà, et ce que les paquets et les environnements ajoutent par-dessus. Lequel de ces retours mérite la quinzaine plutôt que JavaScript se règle dans le choix du premier langage, sur ce dont dépend réellement le choix. L'interpréteur qui fait tourner tout ça est ce qui se passe entre votre fichier et le processeur.