使用記錄到 stdout 的函式庫時,擷取其輸出可以深入了解其行為。本文探討了一種在 Python 中實作任意函數呼叫的 stdout 捕獲的解決方法。
要捕獲特定程式碼區塊內的stdout 輸出,請考慮使用下列上下文管理器:
<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>
要使用此上下文管理器,只需包裝函數呼叫即可:
<code class="python">with Capturing() as output: do_something(my_object)</code>
輸出變數現在將包含函數呼叫列印的行列表。
上下文管理器可以多次使用,並且結果將被串聯。例如:
<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>
這將產生輸出:
displays on screen done output: ['hello world', 'hello world2']
在 Python 3.4 及更高版本中, contextlib.redirect_stdout() 提供了另一種重定向 stdout 的方法。然而,捕獲上下文管理器提供了既是清單又是上下文管理器的優勢。
以上是如何捕捉 Python 函數呼叫的 stdout 輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!