【问题标题】:Redirect stdout and stderr to same file using Python使用 Python 将 stdout 和 stderr 重定向到同一个文件
【发布时间】:2016-08-04 19:43:48
【问题描述】:

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

$ python myfile.py &> out.txt

执行我想要的相同任务,但我需要从 Python 脚本本身执行它。

我查看了Redirect subprocess stderr to stdoutHow to redirect stderr in Python? 和来自here 的示例 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?我不想写异常,因为在那种情况下我必须在脚本中写太多异常。我正在使用 Python 2.7。

更新:正如下面的答案和 cmets 所指出的,SyntaxError 将始终输出到屏幕,我替换了该行

print "a   # missing end quote, will give error

通过

print 1/0  # Zero division error

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

【问题讨论】:

  • 尝试在代码中引发非语法错误的错误。在print "a" 之后,引发类似raise ValueError('A very specific bad thing happened') 的错误
  • @JamesRusso,出于我在问题中提到的原因,我不想提出任何类型的异常。有没有办法从 Python 脚本本身内部模拟“&> 文件名”的 bash 方式?
  • 我指的只是为了测试目的......为了测试它是否正常工作,只需引发一个错误并确保它被写入您的文件。如果是这样,所有未来的错误都应该写入文件
  • @jsbueno 和 James Russo,看起来问题出在 SyntaxError 上。可能其他异常会根据我的需要重定向到文件。
  • @jsbueno 这在 Python 3.6 中不起作用吗?我正在玩类似的代码,但没有打印出文本文件。

标签: python python-2.7 stderr


【解决方案1】:

这行得通

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

【讨论】:

  • 我确认它有效。我尝试了除以零,并在同一个日志文件中获得了回溯和“ZeroDivisionError:除以零”,而不是同时打开了标准输出。我正在使用 Python 3.7.1
【解决方案2】:

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

在代码中故意生成异常的正确方法是使用 Pyton 命令raise

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

raise Exception

然后你可以看到你的伎俩会奏效。

您的程序可能会在运行时以许多其他方式在运行时失败而无需显式提升,例如,如果您强制除以 0,或者只是尝试使用未分配(因此“未声明”)的变量 - 但故意的 SyntaxError 会程序从不运行开始的效果 - 甚至不是前几行。

【讨论】:

  • 我将 raise Exception 这一行放在脚本的末尾,但仍会输出到屏幕。我特别看到了 SyntaxError 的问题。在我的实际脚本中,问题很可能不是语法错误,而是数字。但是,无论如何,我想将错误发送到文件中。
  • 好吧 - 我刚刚使用了你的确切模式,它对我有用。当然,如果是未捕获的异常会在字符串上打印内容,那也意味着程序在该点终止。但是异常回溯到一个文件。
猜你喜欢
  • 2014-07-22
  • 2013-02-15
  • 1970-01-01
  • 2015-06-21
  • 2011-12-28
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多