首页  >  文章  >  后端开发  >  如何在Python方法中临时重定向stdout/stderr而不影响本地流副本?

如何在Python方法中临时重定向stdout/stderr而不影响本地流副本?

Barbara Streisand
Barbara Streisand原创
2024-10-27 00:12:30296浏览

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

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