我有一个上下文管理器,通过临时重新定义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 __
方法中,当定义stderr
andstdout
参数时,但不将此值分配给and 。因此,和是假的,因此输出流仍为和。None
devnull
stderr
stdout
stderr
stdout
sys.stderr
sys.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] 删除。
我来说两句