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() が標準出力をリダイレクトする代替アプローチを提供します。ただし、キャプチャ コンテキスト マネージャーには、リストとコンテキスト マネージャーの両方であるという利点があります。
以上がPython 関数呼び出しの stdout 出力をキャプチャする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。