stdout Redirector

Manchmal würde man gerne alle print-Statements bzw. alle Ausgaben an stdout in einen Buffer umleiten.

Dazu muss man nur sys.stdout umleiten. Dazu kann man das StringIO-Modul verwenden. Einfachste Möglichkeit ist die Angabe des Ausgabebuffers:

   1 # StringIO Modul importieren und einen Buffer erstellen
   2 import StringIO
   3 output = StringIO.StringIO()
   4 
   5 # print in den buffer schreiben lassen
   6 print >> output, "Hallo Welt"
   7 
   8 # Buffer ausgeben
   9 print "Bufferinhalt:"
  10 print output.getvalue()

Die zweite Möglichkeit ist es sys.stdout umzuleiten:

   1 # StringIO Modul importieren und einen Buffer erstellen
   2 import sys
   3 import StringIO
   4 output = StringIO.StringIO()
   5 
   6 old_stdout = sys.stdout
   7 
   8 # sys.stdout umleiten
   9 sys.stdout = output
  10 
  11 print "Hallo Welt"
  12 
  13 # alten stdout wiederherstellen
  14 sys.stdout = old_stdout
  15 
  16 # Buffer ausgeben
  17 print "Bufferinhalt:"
  18 print output.getvalue()

Und hier ist eine Möglichkeit ohne StringIO:

   1 import sys
   2 
   3 class out_buffer:
   4     """
   5     Hilfsklasse um Ausgaben erst zwischenzuspeichern und dann gesammelt auszugeben.
   6     Arbeitet wie StringIO -- aber natürlich kann man die write-Methode beliebig
   7     anpassen.
   8     """
   9     def __init__(self):
  10         self.data = []
  11 
  12     def write(self, txt):
  13         self.data.append(txt)
  14 
  15     def get(self):
  16         return ''.join(self.data)
  17 
  18     def getall(self):               # Inhalt ausgeben und Buffer leeren
  19         buf = ''.join(self.data)
  20         self.data = []
  21         return buf
  22 
  23 
  24 if __name__ == "__main__":
  25     # stdout speichern
  26     save_stdout = sys.stdout
  27 
  28     My_out_buffer = out_buffer() # Buffer erzeugen
  29     sys.stdout = My_out_buffer   # umleiten
  30 
  31     print "bla bla", 3846
  32     print "blub..."
  33     sys.stdout.write("test2")    # ...das geht auch...
  34 
  35     # stdout wiederherstellen
  36     sys.stdout = save_stdout
  37 
  38     print "Das wars:\n'''%s'''" % My_out_buffer.get()


http://www.python-forum.de/viewtopic.php?p=23877#23877

stdout Redirector (last edited 2010-03-17 12:14:26 by p5B11863B)