使用Python将stdout和stderr重定向到同一个文件



我想将Python脚本的标准错误和标准输出重定向到同一个输出文件。从终端我可以使用

$ python myfile.py &> out.txt

来完成我想要的相同任务,但我需要从Python脚本本身完成。

我研究了以下问题:将子进程stderr重定向到stdout,如何在Python中重定向stderr?,和示例10.10,然后我尝试了以下操作:

import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock
print "a"

它正确地打印了out.txt文件中的字母"a";然而,当我尝试以下操作时:

import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock
print "a   # missing end quote, will give error

我在终端上收到错误消息"SyntaxError…",但在文件out.txt中没有。我需要做什么才能将SyntaxError发送到文件out.txt?我不想写一个Exception,因为在这种情况下,我必须在脚本中写太多Exception。我使用的是Python 2.7。

更新:正如下面的回答和评论中所指出的,SyntaxError将始终输出到屏幕,我替换了行

print "a   # missing end quote, will give error

通过

print 1/0  # Zero division error

ZeroDivisionError被输出到文件中,因为我想在我的问题中有它。

这适用于

sys.stdout = open('out.log', 'w')
sys.stderr = sys.stdout

在程序开始运行之前,就会在类似上面的Python文件中引发SyntaxError:Python文件的编译与任何其他编译语言一样——如果解析器或编译器在Python文件中找不到意义,则不会生成可执行字节码,因此程序不会运行。

在代码中故意生成异常的正确方法是使用Pyton命令raise,从像您这样的简单测试用例到实现复杂的流控制模式。

把你的打印留在那里,最后写一行这样的字:

raise Exception

然后你可以看到你的把戏会奏效。

如果没有显式提升,程序在运行时可能会以许多其他方式失败,例如,如果强制除以0,或者只是尝试使用未分配的(因此是"未声明的"(变量,但故意使用SyntaxError会产生程序从未运行过的效果,甚至前几行也不会。

相关内容

  • 没有找到相关文章

最新更新