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

时间:2016-08-04 19:43:48

标签: python python-2.7 stderr

我想将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输出到文件,因为我想在我的问题中使用它。

2 个答案:

答案 0 :(得分:3)

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

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

将打印件留在那里,最后留下这样的一行:

raise Exception

然后你可以看到你的技巧会起作用。

你的程序可能在许多其他方面在运行时失败而没有明显的提升,例如,如果你强制除以0,或者只是尝试使用未分配的(因此"未声明的")变量 - 但是故意的SyntaxError将导致程序从不运行开始 - 甚至不是前几行。

答案 1 :(得分:0)

这有效

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