Python:将sys.stdout恢复为默认值

8

我想将输出写入文件,所以我执行了以下操作

sys.stdout = open(outfile, 'w+')

但是我想要在写入文件后打印回控制台

sys.stdout.close()
sys.stdout = None

我得到了

AttributeError: 'NoneType' object has no attribute 'write'

显然,默认的输出流不能是None,那么我应该如何告诉Python呢?
sys.stdout = use_the_default_one()

一种方法是在分配给 outfile 之前将其存储为 default_sysout,然后在关闭 outfile 后使用 default_sysout 再次分配回去,但以防万一我没有它,我可以在哪里获取它? - Saravanabalagi Ramachandran
3个回答

8
你可以通过重新分配给 sys.__stdout__ 来恢复到原始流。

文档中可知:

包含程序开始时 stdin、stderr 和 stdout 的原始值。它们在最终化期间使用,并且即使 sys.std* 对象已被重定向,也可能对将内容打印到实际标准流有用。

redirect_stdout 上下文管理器可以取代手动重新分配的方法:
import contextlib

with contextlib.redirect_stdout(myoutputfile):
    print(output) 

有一个类似的redirect_stderr的函数。

更改sys.stdout具有全局影响。例如,在多线程环境下可能是不可取的。在简单脚本中,这也可能被视为过度设计。一种本地化、替代的方法是通过其file关键字参数将输出流传递给print

print(output, file=myoutputfile) 

sys.__stdout__: 这正是我在寻找的。我的代码中少了一个变量 :) 耶! - Saravanabalagi Ramachandran

6
在Python3中,可以使用redirect_stdout来实现;以下是一个类似的示例:

要将help()的输出发送到磁盘上的文件中,请将输出重定向到普通文件:

with open('help.txt', 'w') as f:
    with redirect_stdout(f):
        help(pow)

1
根据这里的答案,您不需要保存旧的标准输出的引用。只需使用sys.__stdout__即可。
此外,您可能考虑使用with open('filename.txt', 'w+') as f并使用f.write代替。

谢谢,但我希望所有警告和其他打印语句都能打印到文件中。 - Saravanabalagi Ramachandran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接