【问题标题】:How to redirect stderr to a file in Python?如何将stderr重定向到Python中的文件?
【发布时间】:2015-11-03 13:21:28
【问题描述】:

我从http://forums.devshed.com/python-programming-11/redirect-stdout-stderr-file-500952.html 获得的以下代码告诉了如何将标准错误重定向到文件。我试过了,但错误消息没有保存到文件中。虽然我没有使用

sys.stderr = file_err

错误显示在空闲终端中,当我将 file_err 分配给 sys.stderr 时,错误未显示在空闲终端中,并且没有被复制到 file_name.log

import sys

original_stderr = sys.stderr
file_err = open('file_name.log', 'w') # I tried with .txt also
sys.stderr = file_err
print(list[file]) # Used to create a NameError
sys.stderr = original_stderr
file_err.close()

我应该将它写入文件还是程序中有错误?

【问题讨论】:

  • 此代码 sn-p 在我的机器上的 file_name.log 中打印一个 Traceback 错误。你那里会发生什么?你期望会发生什么?你如何运行它?
  • 从 shell 重定向 stderr 有什么问题?如果你想记录,stdlib 中有一个专用的包,它可以提供更多...
  • 我只有一个问题:您是否在 Python Shell 中运行了代码?
  • @nos 我只是在学习标准流的工作,而 sys.stdout 工作正常。所以我正在尝试使用 sys.stderr。我只想将错误消息复制到文件中。我正在使用 python 3.4。

标签: python


【解决方案1】:

您的代码工作正常(我的意思是:重定向到标准错误。)。但是请注意,与从 python3.5 相比,您可以使用 contextlib.redirect_stderr 的上下文管理器来执行此操作:

from contextlib import redirect_stderr

with open('filename.log', 'w') as stderr, redirect_stderr(stderr):
    # errors from here are logged to the file.

注意:

  • 您不必显式调用close
  • 您不必显式保存旧的 stderr 并在最后恢复它。

顺便说一句:您可以简单地使用sys.__stderr__,而不是保存旧的stderr 值。

【讨论】:

  • 抱歉,操作代码不能“正常工作” - print(list[file]) 行之后的所有内容都将被忽略,因为未处理异常。
  • @brunodesthuilliers 我的意思是 redirection 工作正常。程序过早结束的事实是另一回事... AFAIK 这是预期的,因为如果您发现错误,则不会将任何内容写入stderr ..
  • 如果 OP 希望在引发异常后发生任何事情,这很可能是个问题;)
  • @brunodesthuilliers 我在运行您的代码时收到以下错误:'ImportError: cannot import name 'redirect_stderr''
  • @user2825570 你有python 3.5吗?那时redirect_stderr 被介绍了。
猜你喜欢
  • 2014-09-30
  • 2021-06-29
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2012-12-07
相关资源
最近更新 更多