Wie kann man beim Drucken einer großen Menge formatierter Daten einen Fehler durch eine unterbrochene Pipe vermeiden?

8

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

%Vor%

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:

%Vor%

Ich habe auch versucht, die Daten sofort durch zwei aufeinanderfolgende zu spülen sys.stdout.write und sys.stdout.flush Aufrufe, aber nichts passiert ..

    
Thanasis Petsas 03.04.2013, 17:18
quelle

4 Antworten

10

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:

%Vor%     
Martijn Pieters 03.04.2013, 17:26
quelle
1

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%     
Barron 17.05.2016 20:18
quelle
1

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.

    
Gringo Suave 14.10.2017 17:57
quelle
0

Im Allgemeinen versuche ich, den spezifischsten Fehler zu finden, mit dem ich durchkommen kann. In diesem Fall ist BrokenPipeError :

%Vor%

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.

    
Walker Hale IV 07.03.2017 23:47
quelle