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ßt stdout verursacht print 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/...
Schreibe einen Kommentar