Utiliser les sorties standard avec sys.stdout et sys.stderr en Python

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.

Sortie possible :

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().

Sortie :

Pour ajouter explicitement un retour à la ligne, nous pouvons utiliser le caractère spécial \n.

Sortie :

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.

Sortie :

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.

Sortie :

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.

Sortie :

Nous pouvons reproduire le comportement habituel de print() en ajoutant explicitement \n.

Sortie :

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().

Sortie :

Nous pouvons utiliser stdout pour les résultats normaux et stderr pour les erreurs dans le même programme.

Sortie visible dans le terminal :

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.

Sortie :

Pour afficher un message sur la sortie d'erreur, il suffit d'utiliser file=sys.stderr.

Sortie :

Nous pouvons ainsi séparer clairement les résultats normaux et les erreurs tout en conservant la simplicité de print().

Sortie :

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().

Sortie :

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.

Sortie :

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.

Sortie normale :

Depuis un terminal, nous pouvons rediriger la sortie standard vers un fichier nommé resultat.txt avec l'opérateur >.

Sortie dans le terminal :

Le fichier resultat.txt contient alors :

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.

Sortie visible normalement :

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

Sortie dans le terminal :

Le fichier resultats.txt contient :

Le fichier erreurs.txt contient :

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.

Sortie :

Si le diviseur vaut zéro, le message est envoyé vers stderr.

Sortie :

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.

Sortie :

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.

Sortie :

 


 


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/


Leave a Reply

Your email address will not be published. Required fields are marked *