web-dev-qa-db-fra.com

print vs stderr

Y a-t-il des avantages ou des inconvénients spécifiques à print ou stderr?

27
Tyler

Ce ne sont que deux choses différentes. print va généralement à sys.stdout. Il vaut la peine de connaître la différence entre stdin, stdout et stderr - ils ont tous leur utilité.

En particulier, stdout doit être utilisé pour la sortie normale du programme, tandis que stderr doit être réservé uniquement aux messages d'erreur (exécution anormale du programme). Il existe des utilitaires pour fractionner ces flux, qui permettent aux utilisateurs de votre code de faire la différence entre la sortie normale et les erreurs.

34
Daniel Lew

print peut imprimer sur n'importe quel objet de type fichier, y compris sys.stderr.

print >> sys.stderr, 'Text'

Les avantages d'utiliser sys.stderr Pour les erreurs au lieu de sys.stdout Sont les suivants:

  • Si l'utilisateur redirige stdout vers un fichier, il voit toujours des erreurs à l'écran.
  • Il n'est pas mis en mémoire tampon, donc si sys.stderr Est redirigé vers un fichier journal, il y a moins de chances que le programme se bloque avant que l'erreur ne soit enregistrée.

Cette réponse écrite avec Python 2 à l'esprit. Pour Python 3, utilisez print('Text', file=sys.stderr) à la place.

84
Bastien Léonard

Soyez prudent: il y a quelques subtilités ici, y compris si les flux vont vers des appareils interactifs. La plus grande surprise est qu'en Python 3 stderr est mis en mémoire tampon de ligne (au moins sous Unix). Par exemple, dans une fenêtre de terminal, ce qui suit imprime un nombre toutes les deux secondes en Python 2:

for n in range(5):
    print >> sys.stderr, n,     # final comma to squelch newline character
    time.sleep(2)

alors qu'en Python 3, ce qui suit imprime les nombres tous ensemble lorsque la boucle se termine:

for n in range(5):
    print(n, file=sys.stderr, end='')    # print n to sys.stderr with no newline char
    time.sleep(2)
31
Mitchell Model

Il est utile de séparer stderr et stdout lors de l'exécution de votre script en les redirigeant vers différents fichiers. J'utilise généralement stderr pour les messages de journal et pour suivre le flux du programme, mais j'utilise stdout pour des messages plus utiles que je vais utiliser plus tard.

Une autre façon d'écrire sur stderr est l'exemple suivant:

import sys
sys.stderr.write("Error has occurred opening a file!")
2
Vahid Mirjalili