Wie zu vermeiden, ein Broken Pipe-Fehler wenn Sie drucken, eine große Menge von formatierten Daten?
Ich versuche, drucken Sie eine Liste von Tupeln formatiert in meinem stdout
. Für diese verwende ich die str.format Methode. Funktioniert alles einwandfrei, aber wenn ich leiten Sie die Ausgabe zu sehen, die
die ersten Zeilen mit der head
Befehl ein IOError
Auftritt.
Hier ist mein code:
# creating the data
data = []$
for i in range(0, 1000):
pid = 'pid%d' % i
uid = 'uid%d' % i
pname = 'pname%d' % i
data.append( (pid, uid, pname) )
# find max leghed string for each field
pids, uids, pnames = zip(*data)
max_pid = len("%s" % max( pids) )
max_uid = len("%s" % max( uids) )
max_pname = len("%s" % max( pnames) )
# my template for the formatted strings
template = "{0:%d}\t{1:%d}\t{2:%d}" % (max_pid, max_uid, max_pname)
# print the formatted output to stdout
for pid, uid, pname in data:
print template.format(pid, uid, pname)
Und hier ist der Fehler, bekomme ich nach dem ausführen des Befehls: python myscript.py | head
Traceback (most recent call last):
File "lala.py", line 16, in <module>
print template.format(pid, uid, pname)
IOError: [Errno 32] Broken pipe
Kann mir jemand helfen diesbezüglich?
Habe ich print
im try-except
block um den Fehler zu behandeln,
aber danach gab es eine weitere Meldung in der Konsole:
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
Ich habe auch versucht, Spülen Sie sofort die Daten durch eine zwei aufeinander folgenden
sys.stdout.write
und sys.stdout.flush
Anrufe, aber nichts passiert..
- Dies geschieht, weil
head
schließtstdout
verursachtprint
um zu versuchen und schreiben auf eine geschlossene Datei. Was möchten Sie passieren statt? - Ok, danke! Ich möchte vermeiden, den Druck von solchen Meldungen in der Konsole. Ich möchte verwenden eine Variante dieses Codes, um ein Kommandozeilen-tool.
- Diese Frage ist eine mögliche doppelte; siehe: stackoverflow.com/questions/11423225/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
head
liest ausstdout
dann schließt es. Dies bewirkt, dassprint
zu scheitern, intern schreibt essys.stdout
, jetzt geschlossen.Können Sie einfach fangen die
IOError
- und Ausfahrt leise:close failed in file object destructor: sys.excepthook is missing lost sys.stderr
sys.stdout.flush()
direkt nach der print-Anweisung!! Aber der Fehler ist das, was du beschrieben hast! Mir ist auch aufgefallen, dass aus irgendeinem Grund, wenn ich den flush aus der Schleife, es funktioniert auch.. Naja. danke!!! 🙂flush
nach derprint
und alles funktioniert Super!warnings
Modul; oder ist das nicht einer von denen?Das Verhalten, das Sie sehen, ist verknüpft mit der gepufferten Ausgabe-Implementierung in Python ist3. Das problem kann vermieden werden mit der option-u oder die Festlegung ökologischer Variablen PYTHONUNBUFFERED=x. Siehe die man-Seiten für weitere Informationen über -u.
Im Allgemeinen, versuche ich zu fangen, die spezifischen Fehler, die ich bekommen kann Weg mit. In diesem Fall ist es
BrokenPipeError
:Wenn dies am Ende der Ausführung, finde ich, ich muss nur in der Nähe
sys.stderr
. Wenn ich nicht in der Nähesys.stderr
, ich werde eine BrokenPipeError aber ohne einen stack-trace.Dies scheint das minimum fix für das schreiben von tools, mit Ausgang zu den pipelines.
Hatte dieses problem mit Python ist3 und die debug-Protokollierung geleitet, in den Kopf als auch. Wenn Ihr Skript Gespräche, um das Netzwerk oder tut, Datei IO, einfach fallenlassen IOError ' s ist keine gute Lösung. Trotz erwähnt hier, ich war nicht in der Lage zu fangen BrokenPipeError aus irgendeinem Grund.
Fand einen blog post darüber zu reden wiederherstellen der Standard-signal-handler für den sigpipe: http://newbebweb.blogspot.com/2012/02/python-head-ioerror-errno-32-broken.html
Kurz, fügen Sie den folgenden Code in den Skript vor der Großteil der Ausgabe:
Scheint dies zu passieren, mit Kopf, aber nicht von anderen Programmen wie grep---wie bereits erwähnt-Kopf schließt stdout. Wenn Sie nicht Kopf mit der Skript, oft, es nicht Wert ist sich Gedanken über.