Gibt es spezifische Vorteile oder Nachteile entweder print
oder stderr
?print vs stderr
Antwort
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.
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. groß! Ich war mir dieser Eigenschaft von 'print' nicht bewusst – db42
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)
Sehr interessant. Ich frage mich, warum sie sich entschieden haben, diese Route mit Python 3 zu gehen? –
Es wird auf einem Terminal gepuffert und beim Schreiben in eine Datei vollständig gepuffert. :(FAIL. –
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!")
Cool! :) log = sys.stderr.write; log ("Hallo") – AME
- 1. Clojure Druckfunktionen: pr vs print
- 2. Druck .__ doc__ vs getattr (__ gebautet __ "print") .__ doc__
- 3. Python-3x Unicode Print vs schreiben
- 4. Excel Conditional Content/Formatierung für Print vs. Bildschirm und Seitenumbruch
- 5. Vorteile der Protokollierung vs. print() + Protokollierung bewährter Methoden
- 6. Drucken in eine Datei in Python: Redirect vs Print Datei Argument vs schreiben
- 7. Wie stderr in Python umleiten?
- 8. Capture stderr von Python Subprozess.Popen (Befehl, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
- 9. Speichern Sie stdout, stderr und stdout + stderr synchron
- 10. ABAP Stdout und Stderr
- 11. LLVM stdin/stdout/stderr
- 12. Wohin geht java stderr?
- 13. stderr Umleitung zu stdout
- 14. Dupliziere stdout zu stderr
- 15. über stdout/stderr Umleitungen
- 16. Nginx Protokoll zu stderr
- 17. PHP StdErr nach Exec()
- 18. Suppress stderr innerhalb subprocess.check_output()
- 19. Wie schreibt man mit gnuplots print-Anweisung in stdout?
- 20. Wie stelle ich Informationen zu STDERR voran, wenn eine Methode stderr generiert?
- 21. php: echo "", print(), printf()
- 22. Print Sequenzabgleich Datei
- 23. Printwriter und Print nie
- 24. sqlplus print running statement
- 25. Zeichenkette no print C++
- 26. Android Print Intent
- 27. js window.open dann print()
- 28. Print Message Inline Assembly
- 29. GDB: print sockaddr Zeigerwert
- 30. lsof print numerische Ports
Beachten Sie auch, dass stderr ist ungepufferte, was nützlich sein kann. – JimB
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. –
@ JimB in welchem Sinne? – JinSnow