Prépa Python

Expert — chapitre 45 sur 54

Les modules sys, os et pathlib

Interagir avec l'interpréteur, le système de fichiers et les chemins

70 minAbonnés

Au niveau Expert, un programme Python interagit avec son environnement : lire des arguments de ligne de commande, explorer un dossier, gérer des chemins de fichiers de façon portable entre Windows, macOS et Linux. Trois modules standard couvrent ces besoins : sys (l'interpréteur), os (le système d'exploitation), et pathlib (les chemins modernes).

Le module sys

sys donne accès à des informations sur l'interpréteur Python lui-même et ses entrées/sorties.

Arguments de ligne de commande : sys.argv

Quand vous lancez python script.py arg1 arg2, sys.argv contient la liste ["script.py", "arg1", "arg2"].

python
# fichier : compter.py
import sys

if len(sys.argv) < 2:
    print("Usage : python compter.py <nom>")
    sys.exit(1)

nom = sys.argv[1]
print(f"Bonjour {nom} !")

Exécution :

bash
$ python compter.py Alice
Bonjour Alice !

Arrêter le programme : sys.exit()

python
import sys

if erreur_grave:
    print("Erreur : impossible de continuer")
    sys.exit(1)           # code de sortie non-zero = erreur

Codes de sortie conventionnels :

  • 0 (défaut) : succès.
  • 1 : erreur générique.
  • 2 : mauvais usage / mauvais arguments.

Ces codes sont utilisés par les scripts shell (if python script.py; then ...).

La version de Python : sys.version

python
import sys

print(sys.version)
print(sys.version_info)
print(f"Python {sys.version_info.major}.{sys.version_info.minor}")

Utile pour des tests de compatibilité :

python
if sys.version_info < (3, 10):
    raise RuntimeError("Ce script requiert Python 3.10 minimum")

Les flux d'entrée/sortie

sys.stdin, sys.stdout, sys.stderr sont les flux standard.

python
import sys

# Écrire sur la sortie d'erreur (pratique pour les messages de debug)
print("Attention !", file=sys.stderr)

# Lire depuis stdin (utile pour les scripts qui acceptent des données piped)
for ligne in sys.stdin:
    print(f"Reçu : {ligne.strip()}")

Exemple de pipe Unix :

bash
echo "hello\nworld" | python mon_script.py

Le chemin de recherche des modules : sys.path

Python cherche les modules dans les dossiers listés dans sys.path.

python
import sys
print(sys.path[:3], "...")       # 3 premiers éléments

On peut le modifier à l'exécution si besoin (rare et déconseillé) :

python
import sys
sys.path.insert(0, "/chemin/vers/mon/dossier")
import mon_module     # maintenant trouvable

Préférez installer vos modules via pip dans un environnement virtuel.

Le module os

os offre des fonctions système portables (fonctionnent sur Windows, Linux, macOS).

Variables d'environnement : os.environ

python
import os

# Lire une variable d'environnement
home = os.environ.get("HOME", "défaut")
user = os.environ.get("USER", "anonyme")

print(f"HOME : {home}")
print(f"USER : {user}")

# Définir une variable pour les sous-processus
os.environ["MA_VARIABLE"] = "valeur"

Usage typique : récupérer des secrets (API keys, mots de passe) sans les mettre dans le code.

python
import os

API_KEY = os.environ.get("API_KEY")
if not API_KEY:
    raise RuntimeError("La variable d'environnement API_KEY n'est pas définie")

Répertoire courant : os.getcwd(), os.chdir()

python
import os

print("Répertoire actuel :", os.getcwd())

# Changer de répertoire (localement pour le programme)
# os.chdir("/tmp")

Lister un dossier : os.listdir()

python
import os

# Contenu du répertoire courant
print(os.listdir("."))

Créer / supprimer : os.makedirs(), os.remove()

python
import os

# Créer un dossier (avec sous-dossiers intermédiaires)
os.makedirs("mon/dossier/imbrique", exist_ok=True)

# Supprimer un fichier
os.remove("fichier.txt")

# Supprimer un dossier vide
os.rmdir("dossier_vide")

# Supprimer un dossier et tout son contenu
import shutil
shutil.rmtree("dossier_non_vide")

Chemins avec os.path (ancien style)

Le module os.path manipule les chemins sous forme de chaînes. Historiquement la référence, aujourd'hui dépassé par pathlib.

python
import os.path

chemin = "/home/user/documents/rapport.txt"

print(os.path.basename(chemin))       # 'rapport.txt'
print(os.path.dirname(chemin))        # '/home/user/documents'
print(os.path.splitext(chemin))       # ('/home/user/documents/rapport', '.txt')
print(os.path.exists(chemin))         # False (ce chemin n'existe pas)

# Assembler un chemin (portable)
chemin = os.path.join("dossier", "sous_dossier", "fichier.txt")
print(chemin)

Suite réservée aux abonnés

Débloquez l'intégralité du parcours

Les 54 chapitres, les exercices corrigés automatiquement, les examens blancs et le suivi de votre progression.

Voir les offresChapitres en accès libre

Déjà un accès ? Connectez-vous.