2009-06-02 6 views

Antwort

32

Sie sind nur zwei verschiedene Dinge. print geht im Allgemeinen zu sys.stdout. Es ist wert, den Unterschied zwischen stdin, stdout, and stderr zu kennen - sie alle haben ihre Verwendung.

Insbesondere sollte stdout für normale Programmausgabe verwendet werden, während stderr nur für Fehlermeldungen reserviert sein sollte (abnormale Programmausführung). Es gibt Dienstprogramme zum Aufteilen dieser Streams, mit denen Benutzer Ihres Codes zwischen normaler Ausgabe und Fehlern unterscheiden können.

+13

Beachten Sie auch, dass stderr ist ungepufferte, was nützlich sein kann. – JimB

+6

Ich würde den Wortlaut Ihrer Antwort zwicken, um "Programmausgabe" durch "Nicht-Text- oder Nicht-Status-Programmausgabe" zu ersetzen. stderr sollte auch nicht für Fehlermeldungen in allen Fällen reserviert werden - zum Beispiel ein Programm, das auf stdout herunterlädt, das an ein anderes Programm weitergeleitet wird, aber den Download-Fortschritt in stderr (das aus der Pipe ausbricht) druckt. –

+0

@ JimB in welchem ​​Sinne? – JinSnow

80

print kann auf jedes dateiähnliche Objekt drucken, einschließlich sys.stderr.

print >> sys.stderr, 'Text' 

Die Vorteile von sys.stderr für Fehler statt sys.stdout verwenden sind:

  • Wenn der Benutzer stdout in eine Datei umgeleitet, sie sieht immer noch Fehler auf dem Bildschirm.
  • Es ist nicht gepuffert, wenn also sys.stderr in eine Protokolldatei umgeleitet wird, besteht eine geringere Wahrscheinlichkeit, dass das Programm abstürzt, bevor der Fehler protokolliert wurde.

Diese Antwort mit Python geschrieben 2 im Auge behalten. Für Python 3 verwenden Sie stattdessen print('Text', file=sys.stderr).

+1

+1. groß! Ich war mir dieser Eigenschaft von 'print' nicht bewusst – db42

30

Seien Sie vorsichtig: Es gibt einige Feinheiten hier, einschließlich, ob die Streams zu interaktiven Geräten gehen oder nicht. Die größte Überraschung ist, dass in Python 3 stderr liniengepuffert ist (zumindest unter Unix). Beispielsweise in einem Terminal-Fenster, druckt der folgenden eine Reihe alle zwei Sekunden in Python 2:

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

während in Python 3 die folgenden druckt die Zahlen alle zusammen, wenn die Schleife beendet:

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

Sehr interessant. Ich frage mich, warum sie sich entschieden haben, diese Route mit Python 3 zu gehen? –

+0

Es wird auf einem Terminal gepuffert und beim Schreiben in eine Datei vollständig gepuffert. :(FAIL. –

2

Es ist nützlich, stderr und stdout zu trennen, wenn Sie das Skript ausführen, indem Sie sie in andere Dateien umleiten. Ich benutze normalerweise stderr für Protokollnachrichten und um den Ablauf des Programms zu verfolgen, aber benutze stdout für nützlichere Nachrichten, die ich später verwenden werde.

Eine weitere Möglichkeit, um stderr zu schreiben ist wie das folgende Beispiel:

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

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