我想将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会产生程序从未运行过的效果,甚至前几行也不会。