- À propos de sys.stdout et sys.stderr
- Afficher du texte avec sys.stdout.write()
- Comprendre la différence entre print() et sys.stdout.write()
- Afficher les erreurs avec sys.stderr.write()
- Utiliser print() avec sys.stdout et sys.stderr
- Forcer l'affichage avec flush()
- Rediriger la sortie standard vers un fichier
- Rediriger séparément les messages d'erreur
- Utiliser stdout et stderr dans un programme
- À retenir !
1. À propos de sys.stdout et sys.stderr
Le module sys fournit plusieurs flux standards permettant à un programme Python de communiquer avec son environnement. sys.stdout représente la sortie standard, tandis que sys.stderr représente la sortie d'erreur standard.
Dans une utilisation classique depuis un terminal, les deux flux affichent généralement leur contenu dans le terminal. Ils restent cependant deux flux distincts, ce qui permet notamment de rediriger les résultats normaux et les messages d'erreur séparément.
Le programme suivant affiche les objets correspondant aux deux flux.
1 2 3 4 | import sys print(sys.stdout) print(sys.stderr) |
Sortie possible :
1 2 | <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'> |
La représentation exacte peut varier selon le système et l'environnement d'exécution. Ces deux objets se comportent comme des flux texte ouverts en écriture.
2. Afficher du texte avec sys.stdout.write()
La méthode sys.stdout.write() permet d'écrire directement du texte sur la sortie standard. Contrairement à print(), elle n'ajoute pas automatiquement un retour à la ligne à la fin du texte.
Le programme suivant écrit un message avec sys.stdout.write().
1 2 3 | import sys sys.stdout.write("Bonjour Python") |
Sortie :
1 | Bonjour Python |
Pour ajouter explicitement un retour à la ligne, nous pouvons utiliser le caractère spécial \n.
1 2 3 4 | import sys sys.stdout.write("Bonjour Python\n") sys.stdout.write("Bienvenue sur Très Facile\n") |
Sortie :
1 2 | Bonjour Python Bienvenue sur Très Facile |
La méthode write() attend une chaîne de caractères. Pour afficher directement un nombre, il faut donc généralement le convertir avec str() ou construire une chaîne formatée.
1 2 3 4 | import sys age = 25 sys.stdout.write("Âge : " + str(age) + "\n") |
Sortie :
1 | Âge : 25 |
3. Comprendre la différence entre print() et sys.stdout.write()
La fonction print() est généralement plus simple pour afficher des informations. Par défaut, elle écrit sur sys.stdout, convertit les objets en texte et ajoute un caractère de fin de ligne.
Le programme suivant utilise print() pour afficher deux messages.
1 2 | print("Python") print("Django") |
Sortie :
1 2 | Python Django |
Avec sys.stdout.write(), aucun retour à la ligne n'est automatiquement ajouté. Les deux textes suivants sont donc affichés l'un à la suite de l'autre.
1 2 3 4 | import sys sys.stdout.write("Python") sys.stdout.write("Django") |
Sortie :
1 | PythonDjango |
Nous pouvons reproduire le comportement habituel de print() en ajoutant explicitement \n.
1 2 3 4 | import sys sys.stdout.write("Python\n") sys.stdout.write("Django\n") |
Sortie :
1 2 | Python Django |
print() convient donc parfaitement aux affichages courants, tandis que sys.stdout.write() permet de travailler plus directement avec le flux de sortie standard.
4. Afficher les erreurs avec sys.stderr.write()
La variable sys.stderr représente la sortie d'erreur standard. Elle est destinée aux messages d'erreur, aux avertissements et aux informations de diagnostic que nous souhaitons distinguer des résultats normaux du programme.
La méthode sys.stderr.write() fonctionne de manière similaire à sys.stdout.write().
1 2 3 | import sys sys.stderr.write("Erreur : fichier introuvable.\n") |
Sortie :
1 | Erreur : fichier introuvable. |
Nous pouvons utiliser stdout pour les résultats normaux et stderr pour les erreurs dans le même programme.
1 2 3 4 | import sys sys.stdout.write("Traitement du fichier...\n") sys.stderr.write("Erreur : impossible d'ouvrir le fichier.\n") |
Sortie visible dans le terminal :
1 2 | Traitement du fichier... Erreur : impossible d'ouvrir le fichier. |
Même si les deux messages apparaissent dans le même terminal, ils sont envoyés vers deux flux différents. Leur ordre d'affichage visible peut également dépendre de la mise en mémoire tampon et de l'environnement.
5. Utiliser print() avec sys.stdout et sys.stderr
La fonction print() possède un paramètre file qui permet de choisir le flux de destination. Par défaut, print() utilise sys.stdout.
Le programme suivant précise explicitement que le message doit être envoyé vers sys.stdout.
1 2 3 | import sys print("Opération réussie.", file=sys.stdout) |
Sortie :
1 | Opération réussie. |
Pour afficher un message sur la sortie d'erreur, il suffit d'utiliser file=sys.stderr.
1 2 3 | import sys print("Erreur : valeur incorrecte.", file=sys.stderr) |
Sortie :
1 | Erreur : valeur incorrecte. |
Nous pouvons ainsi séparer clairement les résultats normaux et les erreurs tout en conservant la simplicité de print().
1 2 3 4 5 6 7 8 | import sys nombre = -5 if nombre >= 0: print("Nombre accepté :", nombre, file=sys.stdout) else: print("Erreur : nombre négatif.", file=sys.stderr) |
Sortie :
1 | Erreur : nombre négatif. |
6. Forcer l'affichage avec flush()
Les flux de sortie peuvent utiliser un mécanisme de mise en mémoire tampon appelé buffering. Dans certaines situations, les données écrites ne sont donc pas nécessairement envoyées immédiatement vers leur destination.
La méthode flush() permet de demander l'envoi des données actuellement présentes dans le tampon du flux.
Le programme suivant écrit un message puis force l'envoi de la sortie avec sys.stdout.flush().
1 2 3 4 | import sys sys.stdout.write("Chargement...") sys.stdout.flush() |
Sortie :
1 | Chargement... |
La fonction print() possède également un paramètre flush. En lui donnant la valeur True, nous demandons le vidage du flux après l'écriture.
1 | print("Traitement en cours...", flush=True) |
Sortie :
1 | Traitement en cours... |
Cette possibilité est notamment utile pour certains affichages de progression ou lorsqu'un programme doit rendre ses messages disponibles sans attendre un vidage ultérieur du tampon.
7. Rediriger la sortie standard vers un fichier
L'un des principaux intérêts de sys.stdout est que la sortie standard peut être redirigée. Cette redirection peut être effectuée depuis le terminal sans modifier le programme Python.
Supposons que le fichier programme.py contienne le code suivant.
1 2 3 4 5 | import sys sys.stdout.write("Python\n") sys.stdout.write("Django\n") sys.stdout.write("Laravel\n") |
Sortie normale :
1 2 3 | Python Django Laravel |
Depuis un terminal, nous pouvons rediriger la sortie standard vers un fichier nommé resultat.txt avec l'opérateur >.
1 | python programme.py > resultat.txt |
Sortie dans le terminal :
1 | Aucun texte n'est affiché par le programme dans le terminal. |
Le fichier resultat.txt contient alors :
1 2 3 | Python Django Laravel |
Cette technique est très utile pour enregistrer les résultats produits sur stdout sans modifier le code du programme.
8. Rediriger séparément les messages d'erreur
La séparation entre sys.stdout et sys.stderr permet de rediriger les résultats normaux et les erreurs vers des destinations différentes.
Supposons que le programme suivant affiche un résultat sur stdout et une erreur sur stderr.
1 2 3 4 | import sys print("Résultat : 125", file=sys.stdout) print("Erreur : fichier absent", file=sys.stderr) |
Sortie visible normalement :
1 2 | Résultat : 125 Erreur : fichier absent |
Dans de nombreux shells, nous pouvons rediriger la sortie standard et la sortie d'erreur vers deux fichiers distincts avec les opérateurs 1> et 2>.
1 | python programme.py 1>resultats.txt 2>erreurs.txt |
Sortie dans le terminal :
1 | Aucun message du programme n'est affiché dans le terminal. |
Le fichier resultats.txt contient :
1 | Résultat : 125 |
Le fichier erreurs.txt contient :
1 | Erreur : fichier absent |
Par convention courante dans de nombreux environnements en ligne de commande, le descripteur 1 correspond à la sortie standard et le descripteur 2 à la sortie d'erreur standard.
9. Utiliser stdout et stderr dans un programme
Dans un programme réel, il est utile d'envoyer les résultats normaux vers sys.stdout et les messages d'erreur vers sys.stderr. Cette séparation facilite ensuite les redirections et l'utilisation du programme dans des scripts.
Le programme suivant effectue une division et utilise les deux flux selon le résultat de l'opération.
1 2 3 4 5 6 7 8 9 | import sys a = 20 b = 4 if b == 0: print("Erreur : division par zéro.", file=sys.stderr) else: print("Résultat :", a / b, file=sys.stdout) |
Sortie :
1 | Résultat : 5.0 |
Si le diviseur vaut zéro, le message est envoyé vers stderr.
1 2 3 4 5 6 7 8 9 | import sys a = 20 b = 0 if b == 0: print("Erreur : division par zéro.", file=sys.stderr) else: print("Résultat :", a / b, file=sys.stdout) |
Sortie :
1 | Erreur : division par zéro. |
Nous pouvons compléter cette logique avec sys.exit() afin de retourner un code de sortie différent de zéro lorsqu'une erreur empêche la poursuite du programme.
1 2 3 4 5 6 7 8 9 10 | import sys a = 20 b = 0 if b == 0: print("Erreur : division par zéro.", file=sys.stderr) sys.exit(1) print("Résultat :", a / b, file=sys.stdout) |
Sortie :
1 | Erreur : division par zéro. |
Cette organisation permet de distinguer le résultat du programme, le message d'erreur et le code de sortie.
10. À retenir !
Le module sys fournit sys.stdout pour la sortie standard et sys.stderr pour la sortie d'erreur standard. Même si ces deux flux apparaissent souvent dans le même terminal, ils sont distincts et peuvent être traités ou redirigés séparément.
- sys.stdout représente la sortie standard.
- sys.stderr représente la sortie d'erreur standard.
- sys.stdout.write() permet d'écrire directement sur la sortie standard.
- sys.stderr.write() permet d'écrire directement sur la sortie d'erreur.
- write() n'ajoute pas automatiquement de retour à la ligne.
- print() écrit par défaut sur sys.stdout.
- print(..., file=sys.stderr) permet d'envoyer un message vers la sortie d'erreur.
- flush() permet de demander le vidage du tampon d'un flux.
- stdout et stderr peuvent être redirigés séparément.
- sys.exit() peut être associé à sys.stderr pour signaler une erreur et terminer le programme avec un code de sortie approprié.
Le programme suivant rassemble les principales utilisations de sys.stdout et sys.stderr en séparant les informations normales des messages d'erreur.
1 2 3 4 5 6 7 8 9 10 | import sys def division(a, b): if b == 0: print("Erreur : division par zéro.", file=sys.stderr) return print("Calcul effectué avec succès.", file=sys.stdout) print("Résultat :", a / b, file=sys.stdout) division(20, 4) |
Sortie :
1 2 | Calcul effectué avec succès. Résultat : 5.0 |
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


