2009-06-02 6 views

Répondre

32

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.

+13

Notez également que stderr unbuffered, qui peut être utile. – JimB

+6

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

+0

@JimB dans quel sens? – JinSnow

80

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

+1. génial! Je n'étais pas au courant de cette propriété de 'imprimer' – db42

30

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) 
+4

Très intéressant. Je me demande pourquoi ils ont décidé d'aller avec Python 3? –

+0

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 –

2

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!") 
+2

Cool! :) log = sys.stderr.write; log ("bonjour") – AME