Ich versuche, eine Liste von Tupeln zu drucken, die in meinem stdout
formatiert sind. Dazu verwende ich die str.format Methode. Alles funktioniert gut, aber wenn ich die Ausgabe übergebe, um die ersten Zeilen zu sehen, die den head
Befehl verwenden, tritt ein IOError
auf.Wie vermeide ich einen Broken Pipe-Fehler beim Drucken einer großen Menge formatierter Daten?
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, den ich nach dem Ausführen des Befehls erhalten: 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
jemand mir auf diesem helfen?
ich versuchte print
in einem try-except
Block zu setzen, den Fehler zu umgehen, aber nach, dass es eine andere Nachricht in der Konsole:
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
I auch versucht, die Daten sofort durch ein zwei aufeinander folgenden zu spülen happend sys.stdout.write
und sys.stdout.flush
Anrufe, aber nichts ..
Dies geschieht, weil 'head' * schließt *' stdout', wodurch 'print' versucht, in eine geschlossene Datei zu schreiben. Was möchten Sie stattdessen tun? –
Ok, danke! Ich möchte das Drucken solcher Nachrichten in der Konsole vermeiden. Ich möchte eine Variante dieses Codes für ein Befehlszeilentool verwenden. –
Diese Frage ist ein mögliches Duplikat; siehe: http://stackoverflow.com/questions/11423225/why-does-my-python3-script-balk-at-piping-its-output-to-head-o-tail-sys-module –