我想将Python脚本的标准错误和标准输出重定向到同一输出文件。从终端我可以使用
$ python myfile.py &> out.txt
执行我想要的相同任务,但我需要从Python脚本本身完成。
我从Redirect subprocess stderr to stdout查看了问题How to redirect stderr in Python?,here和示例10.10,然后我尝试了以下内容:
import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock
print "a"
正确打印字母" a"在文件out.txt;但是,当我尝试以下内容时:
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,因为在这种情况下我必须在脚本中编写太多的Exceptions。我使用的是Python 2.7。
更新:正如下面的答案和评论中指出的那样,SyntaxError将始终输出到屏幕,我替换了行
print "a # missing end quote, will give error
通过
print 1/0 # Zero division error
ZeroDivisionError输出到文件,因为我想在我的问题中使用它。
答案 0 :(得分:3)
在程序开始运行之前,会引发上述Python文件中的SyntaxError: Python文件的编译方式与任何其他编译语言一样 - 如果解析器或编译器在Python文件中找不到,则不会生成可执行的字节码,因此程序不会运行。
在代码中有意生成异常的正确方法 - 从像你这样的简单测试用例到实现复杂的流控制模式,就是使用Pyton命令raise
。
将打印件留在那里,最后留下这样的一行:
raise Exception
然后你可以看到你的技巧会起作用。
你的程序可能在许多其他方面在运行时失败而没有明显的提升,例如,如果你强制除以0,或者只是尝试使用未分配的(因此"未声明的")变量 - 但是故意的SyntaxError将导致程序从不运行开始 - 甚至不是前几行。
答案 1 :(得分:0)
这有效
sys.stdout = open('out.log', 'w')
sys.stderr = sys.stdout