将stdout重定向到日志文件,同时仍然打印到stdout?

时间:2017-08-02 01:37:10

标签: python-3.x logging

我想在Python脚本的末尾捕获控制台输出。也就是说,我想要正常打印到控制台,并在执行结束时将控制台输出保存到文件中。

我已经看到了各种相关的SO问题123,但它们只是重定向输出而不显示它或使用logging。从我在阅读logging doc时可以看出,您只能记录您编写的代码的输出。

上面所有链接的问题是来自您尚未编写的代码的控制台输出,这些代码也会打印到控制台。 我希望在执行结束时程序的整个控制台输出

我的第一直觉是

logFile = open('LogFile.txt', 'w')
def print_log(msg):
    print(msg)
    logFile.write(msg)

print_log('Hello World!')

logFile.close()

但是这仍然无法从正在使用的其他代码和库中捕获控制台输出。 有没有办法在执行结束时保存python脚本的控制台输出?我觉得应该有一个简单的方法来做到这一点,但我所有的研究都没有找到合适的解决方案

1 个答案:

答案 0 :(得分:1)

我在我的一个项目中使用了这个:

Tee

基本上它完全与Maksym Markov在评论中所说的有一点区别。我通常不想拖延任何输出,所以我写了这个sys.stdout,它捕获stdout(或stderr)上的所有文本,立即打印出来并保存到缓冲区供以后使用。它还关注"修复"代码退出with块时的if __name__ == "__main__": with Tee() as tee: print("Hello World!") print(tee.read())

使用示例:

tee.read()

有一些缺点,例如没有额外的代码,你可以在with块中使用model。但在我的情况下,我总是需要处理整个块的输出。