Ich versuche eine Liste von Tupeln zu drucken, die in meinem stdout
formatiert sind. Dafür verwende ich die Methode str.format . Alles funktioniert gut, aber wenn ich die Ausgabe übergebe, sehe ich die
Erste Zeilen mit dem Befehl head
a IOError
tritt auf.
Hier ist mein Code:
%Vor% Und hier ist der Fehler, den ich bekomme, nachdem ich den Befehl ausgeführt habe: python myscript.py | head
Kann mir jemand dabei helfen?
Ich habe versucht, print
in einen try-except
-Block zu setzen, um den Fehler zu behandeln,
aber danach gab es eine weitere Nachricht in der Konsole:
Ich habe auch versucht, die Daten sofort durch zwei aufeinanderfolgende zu spülen
sys.stdout.write
und sys.stdout.flush
Aufrufe, aber nichts passiert ..
head
liest von stdout
dann schließt es. Dies führt dazu, dass print
fehlschlägt, intern schreibt es in sys.stdout
, jetzt geschlossen.
Sie können einfach fangen die IOError
und beenden Sie still:
Das Verhalten, das Sie sehen, ist mit der gepufferten Ausgabe-Implementierung in Python3 verknüpft. Das Problem kann vermieden werden, indem die Option -u verwendet wird oder die Umgebungsvariable PYTHONUNBUFFERED = x gesetzt wird. Weitere Informationen zu -u finden Sie auf den man-Seiten.
%Vor%Hatte dieses Problem mit Python3 und Debug-Logging in den Kopf gepiped. Wenn Ihr Skript mit dem Netzwerk kommuniziert oder eine Datei-IO ausführt, ist das einfache Löschen von IOError keine gute Lösung. Trotz Erwähnungen hier konnte ich BrokenPipeError aus irgendeinem Grund nicht fangen.
Ich habe einen Blogpost gefunden, in dem es darum geht, den Standard-Signalhandler für sigpipe wiederherzustellen: Ссылка
Kurz gesagt, fügen Sie Ihrem Skript vor dem Großteil der Ausgabe Folgendes hinzu:
%Vor%Das scheint mit dem Kopf zu geschehen, aber nicht mit anderen Programmen wie grep --- wie erwähnt, schließt der Kopf stdout. Wenn Sie nicht häufig mit dem Skript arbeiten, ist es möglicherweise nicht wichtig, sich darüber Gedanken zu machen.
Im Allgemeinen versuche ich, den spezifischsten Fehler zu finden, mit dem ich durchkommen kann. In diesem Fall ist BrokenPipeError
:
Wenn dies am Ende der Ausführung ist, muss ich nur sys.stderr
schließen. Wenn ich sys.stderr
nicht schließe, erhalte ich einen BrokenPipeError, aber keinen Stack-Trace.
Dies scheint der minimale Fix für Schreibwerkzeuge zu sein, die in Pipelines ausgeben.
Tags und Links python format string-formatting ioerror broken-pipe