Y a-t-il des avantages ou des inconvénients spécifiques à print
ou stderr
?
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.
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:
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.
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)
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!")