python - 恢复重定向的 sys.stdout 和 sys.stderr 产生奇怪的结果

标签 python io-redirection

查看其他 stackoverflow 帖子后,我似乎无法解决这个重定向问题。我想做的是抑制 stdoutstderr,然后在捕获错误后恢复它们。抑制效果很好,但恢复它们只成功了一半。

如果我尝试抑制和恢复 stderrstdout,抑制会起作用,但恢复不会起作用。如果我只尝试抑制/恢复 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.stdoutsys.stderr 设置为 None 的原因可能是因为 None code> 没有 write()close() 方法,并且通常行为不像输出流。

关于python - 恢复重定向的 sys.stdout 和 sys.stderr 产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45516168/

相关文章:

bash - 使用 set -x 时重定向 bash 脚本中的所有输出

python - tf.data.Dataset.map() 用于由多个切片组成的数据集

python - 将从 HTML 表中抓取的数据写入 CSV 文件

python - 从字典数据中删除 Unicode

c - lseek 可以进行文件重定向吗?

powershell - PowerShell管道添加换行

python - 如何卸载在anaconda中使用pip安装的opencv-python包?

Python:Sklearn.linear_model.LinearRegression 工作异常

c - IO重定向和缓冲区问题,fflush和c

freepascal - 如何检测 Windows 下 FreePascal 中的 stdin 或 stdout 是否重定向?