stdout/stderr を外部ファイルにリダイレクトするのが一般的ですが、範囲内で一時的にリダイレクトする必要がある場合があります。
通常、既存のソリューションは出力ストリーム全体を置き換え、これらのストリームのローカル コピーは影響を受けません。これは、メソッドがストリームのローカル コピーを使用する場合に問題を引き起こす可能性があります。
この制限に対処するには、コンテキスト マネージャーを使用してリダイレクト ロジックを実装できます。
<code class="python">import os import sys class RedirectStdStreams(object): def __init__(self, stdout=None, stderr=None): self._stdout = stdout or sys.stdout self._stderr = stderr or sys.stderr def __enter__(self): self.old_stdout, self.old_stderr = sys.stdout, sys.stderr self.old_stdout.flush(); self.old_stderr.flush() sys.stdout, sys.stderr = self._stdout, self._stderr def __exit__(self, exc_type, exc_value, traceback): self._stdout.flush(); self._stderr.flush() sys.stdout = self.old_stdout sys.stderr = self.old_stderr</code>
このクラスでは、stdout と stderr の両方を一時的にリダイレクトできます。
使用方法を示すために、出力を /dev/null にリダイレクトし、動作を観察します。
<code class="python">if __name__ == '__main__': devnull = open(os.devnull, 'w') print('Fubar') with RedirectStdStreams(stdout=devnull, stderr=devnull): print("You'll never see me") print("I'm back!")</code>
この例では、リダイレクトがアクティブな間は「You'll Never see me」というメッセージが表示されませんが、その後は表示され、リダイレクトが一時的なものであり、コンテキスト マネージャー内のスコープにのみ影響することが確認されています。
以上がコンテキストマネージャーを使用してPythonでstdout/stderrを一時的にリダイレクトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。