標準出力と標準エラー出力を一時的に、特に Python のメソッドの実行中にリダイレクトすることは可能ですか?
既存のソリューションの落とし穴:
CurrentUserSolutions は、残念ながら、ストリームを純粋にリダイレクトしません。代わりに、それらを完全に置き換えるだけです。ただし、メソッドがいずれかのストリームの ローカル コピー を所有している場合 (たとえば、パラメーターとして使用されているため)、このアプローチは失敗します。
コンテキスト マネージャー ベースのソリューション:
コンテキスト マネージャー内にリダイレクト ロジックをカプセル化することで、この問題に対処できます。以下に例を示します。
<code class="python">import os import sys class RedirectStdStreams: 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 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>
この例で示すように使用すると、このコンテキスト マネージャーは stdout と stderr を一時的に /dev/null にリダイレクトし、「You'll Never see me」行からの出力が確実に表示されないようにします。リダイレクトがアクティブな間は事実上非表示になります。
以上がPython メソッドで stdout と stderr を一時的にリダイレクトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。