Bei der Verwendung von Bibliotheken, die sich bei stdout protokollieren, kann die Erfassung ihrer Ausgabe Einblicke in ihr Verhalten liefern. In diesem Artikel wird eine Problemumgehung untersucht, um die Stdout-Erfassung für beliebige Funktionsaufrufe in Python zu erreichen.
Um die Stdout-Ausgabe in bestimmten Codeblöcken zu erfassen, sollten Sie die Verwendung eines Kontextmanagers wie den folgenden in Betracht ziehen:
<code class="python">from io import StringIO import sys class Capturing(list): def __enter__(self): self._stdout = sys.stdout sys.stdout = self._stringio = StringIO() return self def __exit__(self, *args): self.extend(self._stringio.getvalue().splitlines()) del self._stringio # free up some memory sys.stdout = self._stdout</code>
Um diesen Kontextmanager zu verwenden, schließen Sie einfach den Funktionsaufruf ein:
<code class="python">with Capturing() as output: do_something(my_object)</code>
Die Ausgabevariable enthält nun eine Liste der vom Funktionsaufruf gedruckten Zeilen.
Der Kontextmanager kann mehrfach verwendet werden und die Ergebnisse werden verkettet. Zum Beispiel:
<code class="python">with Capturing() as output: print('hello world') print('displays on screen') with Capturing(output) as output: # note the constructor argument print('hello world2') print('done') print('output:', output)</code>
Dies erzeugt die Ausgabe:
displays on screen done output: ['hello world', 'hello world2']
In Python 3.4 und höher bietet contextlib.redirect_stdout() einen alternativen Ansatz zur Umleitung von stdout. Der Capturing-Kontextmanager bietet jedoch den Vorteil, dass er sowohl eine Liste als auch ein Kontextmanager ist.
Das obige ist der detaillierte Inhalt vonWie erfasst man die Standardausgabe für Python-Funktionsaufrufe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!