首页 >后端开发 >Python教程 >如何使用上下文管理器临时重定向 Python 中的 stdout/stderr?

如何使用上下文管理器临时重定向 Python 中的 stdout/stderr?

Linda Hamilton
Linda Hamilton原创
2024-10-31 00:28:03656浏览

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

临时重定向 stdout/stderr,重新访问

虽然将 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</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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn