Le module sys en langage Python#
Alors que le module os gère les interactions avec le système d'exploitation physique, le module natif sys (System) s'intéresse à l'interpréteur Python lui-même.
Il permet d'inspecter l'environnement d'exécution (version de Python, plateforme matérielle), de manipuler les arguments passés au script en ligne de commande (sys.argv), d'interagir avec les flux d'entrées/sorties bas niveau (sys.stdout, sys.stderr) et de mesurer l'empreinte mémoire exacte des objets.
1. Arguments en ligne de commande : sys.argv#
Lorsque vous lancez un script Python depuis un terminal, vous pouvez lui transmettre des paramètres :
Ces arguments sont immédiatement capturés par Python sous la forme d'une liste de chaînes de caractères nommée sys.argv :
- sys.argv[0] contient toujours le nom du script lui-même ("mon_script.py").
- sys.argv[1] contient le premier argument ("input.csv").
- sys.argv[2] contient le deuxième argument ("42" — notez que c'est une chaîne, conversion requise avec int() !).
import sys
print(f"Nombre total d'arguments : {len(sys.argv)}")
for index, arg in enumerate(sys.argv):
print(f" sys.argv[{index}] = '{arg}'")
2. Quitter proprement un programme : sys.exit()#
La fonction sys.exit(code) interrompt immédiatement l'exécution de tout le programme en levant en interne l'exception SystemExit :
sys.exit(0): signale au terminal une fin normale avec succès.sys.exit(1)(ou tout code non nul) : signale une erreur critique.
import sys
def valider_fichier(nom_fichier: str):
if not nom_fichier.endswith(".csv"):
print("Erreur critique : Le fichier doit obligatoirement porter l'extension .csv !", file=sys.stderr)
sys.exit(1) # Quitte immédiatement le script avec code d'erreur
print("Traitement termine avec succes.")
sys.exit(0)
3. Informations sur l'interpréteur et la plateforme#
sys expose de nombreuses métadonnées sur le runtime :
import sys
# 1. Version de Python
print("Version complete :", sys.version)
print("Numero majeur :", sys.version_info.major) # ex: 3
print("Numero mineur :", sys.version_info.minor) # ex: 11
# 2. Chemin vers l'exécutable Python actif
print("Interpreteur :", sys.executable)
# 3. Plateforme matérielle / OS
print("Plateforme :", sys.platform) # 'win32', 'linux', ou 'darwin' (macOS)
4. Les flux standards : stdin, stdout et stderr#
Python associe trois flux systèmes majeurs :
- sys.stdin : flux d'entrée standard (utilisé sous le capot par input()).
- sys.stdout : flux de sortie standard (utilisé sous le capot par print()).
- sys.stderr : flux d'erreur dédié, dirigé vers la console sans mise en mémoire tampon.
import sys
# Écriture brute sur stdout sans saut de ligne automatique
sys.stdout.write("Impression directe sur stdout.\n")
# Écriture d'un message d'alerte sur le canal des erreurs (stderr)
sys.stderr.write("ATTENTION : Echec de connexion a la passerelle de paiement.\n")
5. Mesure de l'empreinte mémoire : sys.getsizeof()#
Pour analyser la consommation de RAM de vos structures de données, sys.getsizeof(objet) retourne la taille réelle en octets occupée par l'objet dans le Tas :
import sys
entier = 42
chaine = "AlgoJungle"
liste = [1, 2, 3, 4, 5]
dictionnaire = {"a": 1, "b": 2, "c": 3}
print(f"Taille int : {sys.getsizeof(entier):>4} octets")
print(f"Taille str : {sys.getsizeof(chaine):>4} octets")
print(f"Taille list (5 elts): {sys.getsizeof(liste):>4} octets")
print(f"Taille dict (3 cles): {sys.getsizeof(dictionnaire):>4} octets")
6. Mise en pratique : Création d'un utilitaire CLI avec validation#
Concevons un utilitaire en ligne de commande complet capable de traiter un fichier source avec contrôle des arguments :
import sys
import os
def afficher_usage():
nom_prog = os.path.basename(sys.argv[0])
print(f"Usage : python {nom_prog} <chemin_source> <multiplicateur>")
print("Exemple : python app.py donnees.txt 2.5")
def main():
# Vérification du nombre d'arguments attendus (exactement 2 arguments en plus du script)
if len(sys.argv) != 3:
print("Erreur : Nombre d'arguments invalide.", file=sys.stderr)
afficher_usage()
sys.exit(1)
chemin_fichier = sys.argv[1]
param_facteur = sys.argv[2]
# Vérification de l'existence du fichier
if not os.path.exists(chemin_fichier):
print(f"Erreur : Le fichier source '{chemin_fichier}' n'existe pas.", file=sys.stderr)
sys.exit(2)
# Conversion du paramètre numérique
try:
facteur = float(param_facteur)
except ValueError:
print(f"Erreur : Le multiplicateur '{param_facteur}' n'est pas un nombre valide.", file=sys.stderr)
sys.exit(3)
print(f">>> Traitement valide : Fichier='{chemin_fichier}', Facteur={facteur}")
sys.exit(0)
if __name__ == "__main__":
main()
7. Défi d'application#
Écrivez un script additionneur_cli.py qui prend sur la ligne de commande une suite arbitraire de nombres (ex: python additionneur_cli.py 12 4.5 8 10), calcule leur somme et leur moyenne à l'aide de sys.argv[1:], et gère proprement le cas où aucun argument n'est fourni en affichant un code de retour d'erreur sys.exit(1).
Commentaires