当在上下文管理器中定义控制台输出时,为什么devnull在隐藏控制台输出时不起作用?

d3pd

我有一个上下文管理器,通过临时重新定义stdout和stderr来“沉默”某些Python代码的输出。

在代码的主要功能中定义devnull时,代码的输出将成功静音,但是,在上下文管理器中定义devnull时,代码的输出不会被静音。

为什么是这样?上下文管理器如何在定义devnull的同时使输出静音?

import os
import sys

def main():

    print("hello")

    devnull = open(os.devnull, "w")
    with silence(
        stdout = devnull,
        stderr = devnull
        ):
        print("there")

    print("world")

class silence(object):

    def __init__(
        self,
        stdout = None,
        stderr = None
        ):
        if stdout == None and stderr == None:
            devnull = open(os.devnull, "w")
        self._stdout = stdout or sys.stdout
        self._stderr = stderr or sys.stderr

    def __enter__(
        self
        ):
        self.old_stdout = sys.stdout
        self.old_stderr = sys.stderr
        self.old_stdout.flush()
        self.old_stderr.flush()
        sys.stdout = self._stdout
        sys.stderr = 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__":
    main()
蛇魅

在您的__ init __方法中,当定义stderrandstdout参数时,但不将此值分配给and 因此,是假的,因此输出流仍为Nonedevnullstderrstdoutstderrstdoutsys.stderrsys.stdout

class silence(object):

    def __init__(
        self,
        stdout = None,
        stderr = None
        ):
        if stdout == None and stderr == None:
            devnull = open(os.devnull, "w")
            # Assign devnull to stdout and stderr
            stdout = devnull
            stderr = devnull
        self._stdout = stdout or sys.stdout
        self._stderr = stderr or sys.stderr 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章