Zum umleiten von stderr in Python?
Ich würde gerne protokollieren Sie die Ausgabe von einem Python-Skript. Ich habe versucht:
import sys
log = []
class writer(object):
def write(self, data):
log.append(data)
sys.stdout = writer()
sys.stderr = writer()
Nun, wenn ich "drucken" etwas "" es wird protokolliert. Aber wenn ich zum Beispiel einige syntax-Fehler, sagen Sie "drucken" etwas# ", es wird nicht protokolliert - es wird in der Konsole statt.
Wie kann ich die erfassen auch die Fehler von Python-interpreter?
Sah ich eine mögliche Lösung hier:
http://www.velocityreviews.com/forums/showpost.php?p=1868822&postcount=3
aber das zweite Beispiel-logs nach /dev/null - das ist nicht das, was ich will. Ich möchte, melden Sie es in eine Liste wie mein Beispiel oben oder StringIO oder so...
Auch, vorzugsweise, die ich nicht erstellen wollen, einen Teilprozess (und Lesen von stdout und stderr in einem separaten thread).
InformationsquelleAutor der Frage EcirH | 2009-12-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nichts tun, in Python-code, capture-Fehler während der Kompilierung des selben Codes. Wie könnte es? Wenn der compiler kann nicht abgeschlossen werden, kompilieren Sie den code, nicht den code ausführen, so dass Ihre Umleitung nicht sogar Effekt noch.
Wo ist das (unerwünschte) Teilprozess kommt. Sie können schreiben, Python-code leitet die stdout, dann ruft den Python-interpreter zu kompilieren, einige andere Stück code.
InformationsquelleAutor der Antwort Ned Batchelder
Ich habe ein Stück software, die ich schrieb für Arbeit erfasst stderr in eine Datei etwa so:
also ist es definitiv möglich.
Ich glaube, dein problem ist, erstellen Sie zwei Instanzen des Schriftstellers.
Vielleicht so etwas wie:
InformationsquelleAutor der Antwort KingRadical
Kann ich nicht denken, eine einfache Möglichkeit. Der python-Prozess der standard-Fehler ist, Leben auf einer tieferen Ebene als eine python-Datei-Objekt (C vs. python).
Könnten Sie wickeln Sie das python-Skript in eine zweite python-Skript und verwenden Teilprozess.Popen. Es ist auch möglich, dass Sie ziehen konnte, etwas Magie, wie dies in einem einzigen Skript:
Verwenden und dann auswählen.poll() zu überprüfen, cat.stdout regelmäßig zu finden Ausgang.
Ja, das scheint zu funktionieren.
Das problem, das ich sehe ist, dass die meisten der Zeit, etwas gedruckt auf stderr von python gibt es zu beenden. Der übliche Weg, dies zu behandeln wäre über Ausnahmen.
---------Edit
Irgendwie verpasste ich die os.pipe () - Funktion.
Las dann aus r
InformationsquelleAutor der Antwort
Eigentlich, wenn du mit linux/mac os, können Sie einfach Datei umleiten, das zu tun. Zum Beispiel, wenn du gehst zu laufen ".py" und notieren Sie alle Nachrichten erzeugen, in Datei "ein.out", es würde einfach sein,
python a.py 2>&1 > a.out
Den ersten Teil leitet stderr nach stdout, und der zweite leitet, die in einer Datei namens ein..
Für eine längere Liste von Umleitung Betreiber in Linux/Unix finden Sie unter https://askubuntu.com/questions/420981/how-do-i-save-terminal-output-to-a-file
InformationsquelleAutor der Antwort VitleysingurQ
InformationsquelleAutor der Antwort yagami raito
Da python 3.5 können Sie
contextlib.redirect_stderr
InformationsquelleAutor der Antwort max
Python nicht ausführen, Ihren code, wenn ein Fehler aufgetreten ist. Aber Sie können importieren Sie Ihr Skript in ein anderes Skript ein abfangen von Ausnahmen. Beispiel:
Script.py
FinalScript.py
InformationsquelleAutor der Antwort ColdGrub1384