ホームページ >バックエンド開発 >Python チュートリアル >ローカル ストリーム コピーに影響を与えずに、Python メソッドで stdout/stderr を一時的にリダイレクトする方法は?
メソッドで stdout/stderr を一時的にリダイレクトする: 不完全な現在のソリューション
Python で stdout/stderr を一時的にリダイレクトする既存のソリューションの問題点は次のとおりです。リダイレクトできないこと。代わりに、ストリームを完全に置き換えます。これは、メソッドがストリームのローカル コピー (パラメータとして渡されるなど) を所有し、リダイレクトが無効になる場合に問題になります。
Contextmanager による解決策
別のアプローチには、 contextmanager を使用してリダイレクト ロジックをカプセル化します。このアプローチにより、ローカル ストリームのコピーに影響を与えることなく、リダイレクトがコンテキスト内でのみアクティブになることが保証されます。
<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 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>
この例では、RedirectStdStreams クラスは、stdout と stderr の両方を指定された宛先にリダイレクトするように設計されています (例: /dev/null) 定義されたコンテキスト内で。このアプローチでは、ローカル ストリームのコピーを中断することなく、ストリームを効果的にリダイレクトします。
以上がローカル ストリーム コピーに影響を与えずに、Python メソッドで stdout/stderr を一時的にリダイレクトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。