コンテキストマネージャーを使用してPythonでstdout/stderrを一時的にリダイレクトする方法は?

Linda Hamilton
リリース: 2024-10-31 00:28:03
オリジナル
584 人が閲覧しました

How to Temporarily Redirect stdout/stderr in Python with a Context Manager?

stdout/stderr の一時的なリダイレクト、再考

stdout/stderr を外部ファイルにリダイレクトするのが一般的ですが、範囲内で一時的にリダイレクトする必要がある場合があります。

現在のソリューションの制限

通常、既存のソリューションは出力ストリーム全体を置き換え、これらのストリームのローカル コピーは影響を受けません。これは、メソッドがストリームのローカル コピーを使用する場合に問題を引き起こす可能性があります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!