Python メソッドで stdout と stderr を一時的にリダイレクトする方法は?

DDD
リリース: 2024-10-28 12:09:01
オリジナル
539 人が閲覧しました

How to Temporarily Redirect stdout and stderr in Python Methods?

標準出力と標準エラー出力を一時的にリダイレクトします

標準出力と標準エラー出力を一時的に、特に 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート