ホームページ  >  記事  >  バックエンド開発  >  ローカル ストリーム コピーに影響を与えずに、Python メソッドで stdout/stderr を一時的にリダイレクトする方法は?

ローカル ストリーム コピーに影響を与えずに、Python メソッドで stdout/stderr を一時的にリダイレクトする方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 00:12:30235ブラウズ

How to Temporarily Redirect stdout/stderr in Python Methods Without Affecting Local Stream Copies?

メソッドで 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。