Ich benutze diesen Kontextmanager , um die Ausgabe zu erfassen. Es verwendet letztendlich die gleiche Technik wie einige der anderen Antworten, indem es vorübergehend ersetzt wird sys.stdout
. Ich bevorzuge den Kontextmanager, weil er die gesamte Buchhaltung in einer einzigen Funktion zusammenfasst, sodass ich keinen Try-finally-Code neu schreiben muss und keine Setup- und Teardown-Funktionen nur dafür schreiben muss.
import sys
from contextlib import contextmanager
from StringIO import StringIO
@contextmanager
def captured_output():
new_out, new_err = StringIO(), StringIO()
old_out, old_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = new_out, new_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = old_out, old_err
Verwenden Sie es so:
with captured_output() as (out, err):
foo()
# This can go inside or outside the `with` block
output = out.getvalue().strip()
self.assertEqual(output, 'hello world!')
Da der ursprüngliche Ausgabezustand beim Verlassen des with
Blocks wiederhergestellt wird , können wir außerdem einen zweiten Erfassungsblock in derselben Funktion wie den ersten einrichten, was mit Setup- und Teardown-Funktionen nicht möglich ist und beim Schreiben von try-finally wortreich wird blockiert manuell. Diese Fähigkeit erwies sich als nützlich, wenn das Ziel eines Tests darin bestand, die Ergebnisse zweier Funktionen relativ zueinander und nicht mit einem vorberechneten Wert zu vergleichen.
with mock.patch('sys.stdout', new_callable=StringIO.StringIO):
pypi.python.org/pypi/mock