查看其他 stackoverflow 帖子后,我似乎无法解决这个重定向问题。我想做的是抑制 stdout
和 stderr
,然后在捕获错误后恢复它们。抑制效果很好,但恢复它们只成功了一半。
如果我尝试抑制和恢复 stderr
和 stdout
,抑制会起作用,但恢复不会起作用。如果我只尝试抑制/恢复 stdout
它会起作用(但随后我会得到所有我不想要的 stderr
文本)。
我无法推理出为什么会有任何差异导致 stderr
阻止 stdout
被恢复,希望得到关于原因的输入(或者如果我我正在做一些奇怪/愚蠢的事情)
这是我想要工作的代码,但只抑制 out/err 并且不恢复('Restored stdout'
永远不会打印):
sys.stdout = None
sys.stderr = None
try:
op_args = op_parse.parse_args(selection.split(' '))
except SystemExit:
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
print("Restored stdout")
这是抑制 stdout
并恢复它的代码(以打印讨厌的 stderr
为代价):
sys.stdout = None
#sys.stderr = None
try:
op_args = op_parse.parse_args(selection.split(' '))
except SystemExit:
sys.stdout = sys.__stdout__
#sys.stderr = sys.__stderr__
print("Restored stdout")
编辑:我找到了解决方法,但我仍然对为什么会出现上述问题感兴趣。我的解决方法是将 stdout
/stderr
重新分配给 = open("/dev/null", "w")
这确实会产生我的行为想。同样,我仍然希望了解原始问题的意见。
最佳答案
您可以通过创建上下文管理器来更优雅地做到这一点:
import os
from contextlib import contextmanager
@contextmanager
def nullout():
save_stdout = sys.stdout
save_stderr = sys.stderr
sys.stdout = open(os.devnull, 'w')
sys.stderr = open(os.devnull, 'w')
try:
yield
finally:
sys.stdout = save_stdout
sys.stderr = save_stderr
with nullout():
op_args = op_parse.parse_args(selection.split(' '))
上下文管理器的一个好处是,无论是否发生异常,yield
之后的代码都会被执行。
您不能将 sys.stdout
和 sys.stderr
设置为 None
的原因可能是因为 None
code> 没有 write()
或 close()
方法,并且通常行为不像输出流。
关于python - 恢复重定向的 sys.stdout 和 sys.stderr 产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45516168/