Umleiten von stdout und stderr zu gleichen Datei mit Python
Möchte ich umleiten den standard-Fehler und standard-Ausgabe von einem Python-Skript, um die gleiche Ausgabe-Datei. Aus dem terminal, die ich verwenden könnte
$ python myfile.py &> out.txt
tun, die gleiche Aufgabe, die ich will, aber ich muss es tun aus dem Python-Skript selbst.
Schaute ich in das Fragen Redirect Teilprozess stderr nach stdout, Zum umleiten von stderr in Python?, und Beispiel 10.10 aus hier, und dann habe ich versucht, die folgenden:
import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock
print "a"
welche zu Recht der entsprechende Buchstabe "a" in der Datei out.txt sein; aber, wenn ich das folgende versuchen:
import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock
print "a # missing end quote, will give error
Bekomme ich die Fehlermeldung "SyntaxError ..." auf das terminal, aber nicht in der Datei out.txt. Was muss ich tun, um das senden der SyntaxError zu der Datei out.txt? Ich will nicht zu schreiben hier eine Ausnahme, weil in diesem Fall habe ich zu schreiben, zu viele Ausnahmen in das Skript. Ich verwende Python 2.7.
Update: Wie bereits in den Antworten und Kommentaren, dass SyntaxError immer Ausgabe auf Bildschirm, ersetzte ich die Zeile
print "a # missing end quote, will give error
durch
print 1/0 # Zero division error
Den ZeroDivisionError ist die Ausgabe in Datei, als wollte ich es in meiner Frage.
- versuchen Sie heben ein Fehler in Ihrem code, der nicht einen syntax-Fehler. Nach
print "a"
, ein Fehler wieraise ValueError('A very specific bad thing happened')
- Ich würde es vorziehen, nicht zu erhöhen Ausnahme aller Art, für der Grund, dass ich erwähnt habe in der Frage. Gibt es eine Möglichkeit, zu emulieren, die bash als "&> mit dem Namen von" in das Python-Skript selbst?
- Ich meinte nur zu Testzwecken... um zu testen, dass es nur ein Fehler und stellen Sie sicher, es ist geschrieben, um Ihre Datei. Wenn also künftig alle Fehler in die Datei geschrieben werden
- und James Russo, Sieht aus wie das problem war mit dem SyntaxError. Wahrscheinlich auch andere Ausnahmen sind die Weiterleitung zu Datei, wie ich wollte.
- Funktioniert das nicht in Python 3.6? Ich bin Herumspielen mit ähnlichem code, aber nichts wird gedruckt, die text-Datei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen SyntaxError in eine Python-Datei wie oben angehoben ist, bevor Sie Ihr Programm selbst beginnt zu laufen:
Python-Dateien kompiliert werden, genau wie in jeder anderen kompilierten Sprache - wenn der parser oder compiler nicht finden können, Sinn in Ihre Python-Datei, keine ausführbaren bytecode erzeugt wird, daher das Programm nicht ausgeführt werden.
Den richtigen Weg, um eine Ausnahme generiert, die auf den Zweck deiner code - vom einfachen test-Fällen, wie dem ihrigen, bis zur Implementierung von komplexen flow-control-Muster, ist die Verwendung der Pyton-Befehl
raise
.Lassen Sie einfach Ihre print dort, und eine Zeile wie diese am Ende:
Dann sehen Sie, dass Ihr trick funktioniert.
Ihr Programm könnte nicht in runtime in viele andere Möglichkeiten, ohne eine explizite erhöhen, wie, wenn Sie erzwingen, dass eine division durch 0, oder einfach versuchen, einen nicht zugewiesenen (und daher "schwarzarbeit") Variablen - sondern eine bewusste SyntaxError wird den Effekt haben, dass das Programm läuft nicht mit zu beginnen - nicht einmal die ersten paar Zeilen.
Dies funktioniert