Y a-t-il des avantages ou des inconvénients spécifiques à print
ou stderr
?impression vs stderr
Répondre
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
, and stderr
- ils ont tous leurs utilisations.
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 de programme anormale). Il existe des utilitaires pour diviser ces flux, ce qui permet aux utilisateurs de votre code de différencier la sortie normale des erreurs.
print
peut imprimer sur n'importe quel objet semblable à un fichier, y compris sys.stderr
.
print >> sys.stderr, 'Text'
Les avantages de l'utilisation sys.stderr
pour les erreurs au lieu de sys.stdout
sont:
- Si l'utilisateur stdout vers un fichier, elle voit encore 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 risques que le programme ne plante avant que l'erreur ne soit consignée.
Cette réponse écrite avec Python 2 à l'esprit. Pour Python 3, utilisez print('Text', file=sys.stderr)
à la place.
+1. génial! Je n'étais pas au courant de cette propriété de 'imprimer' – db42
Attention: il y a quelques subtilités ici, y compris si les flux vont ou non vers des dispositifs interactifs. La plus grande surprise est que dans Python 3 stderr est mis en mémoire tampon (au moins dans Unix). Par exemple, dans une fenêtre de terminal, ce qui suit imprime un numéro 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, les impressions suivantes les numéros tous ensemble lorsque les finitions en boucle:
for n in range(5):
print(n, file=sys.stderr, end='') # print n to sys.stderr with no newline char
time.sleep(2)
Très intéressant. Je me demande pourquoi ils ont décidé d'aller avec Python 3? –
La ligne est mise en mémoire tampon sur un terminal et entièrement mise en mémoire tampon lors de l'écriture dans un fichier. :(FAIL –
Il est utile de séparer stderr et stdout lors de l'exécution de votre script en les redirigeant vers des fichiers différents. J'utilise habituellement stderr pour les messages du journal et pour suivre le flux du programme, mais utilisez stdout pour les messages plus utiles que je vais utiliser plus tard.
Une autre façon d'écrire à stderr est comme l'exemple suivant:
import sys
sys.stderr.write("Error has occurred opening a file!")
Cool! :) log = sys.stderr.write; log ("bonjour") – AME
Notez également que stderr unbuffered, qui peut être utile. – JimB
Je modifierais le libellé de votre réponse pour remplacer «sortie de programme» par «sortie de programme non textuel ou sans état». stderr ne doit pas non plus être réservé pour les messages d'erreur dans tous les cas - par exemple, un programme qui télécharge sur stdout, qui est redirigé vers un autre programme, mais imprime la progression du téléchargement dans stderr (qui sort du tube). –
@JimB dans quel sens? – JinSnow