【问题标题】:how to write std.error to file but std.out to console in python? [duplicate]python - 如何将std.error写入文件但将std.out写入python控制台? [复制]
【发布时间】:2014-02-14 21:34:01
【问题描述】:

在这个例子中,我想在try block 中将write 控制台(std.out); 但是当except block抛出异常时,我想将异常内容写入std.err,然后将其重定向到日志file

我可以在except 块中打开一个file,然后在上面打开write。但这需要为每个 try-catch 块完成,因此如果有 re-directing 的替代方案,这些异常将出现在 std.err 并记录 std.error。

>>> try:
...   print "hello world"
...   1/0
... except ZeroDivisionError as e:
...   print "exception"
... 
hello world
exception

【问题讨论】:

  • 我没有投票,但我无法确定问题的正面或反面(当您向标准输出写入内容时,会导致其他一些输出被重定向到标准错误???)跨度>
  • @NPE:我正在重新格式化问题。
  • @LegoStormtroopr:我知道这个print>> sys.stderr, 'spam'。但我想知道是否可以将所有 sys.stderr 重定向到一个文件,而不是默认为控制台。

标签: python exception try-catch stderr


【解决方案1】:

如果要打印到 stderr,请使用 sys.stderr 并让操作系统和用户处理打印到 std.err 的文本的去向。这允许用户在 Posix 终端上运行 python your_script.py 2> my_err_output 并仍然捕获 std.err 内容。

如果您想将日志信息输出到特定文件,请改用use the logging module

不要修改一个非常标准的概念的行为 - 那样会出错。 正确的日志记录可以让您捕获所需的信息,但允许预期回溯(通过管道传送到 stderr ) 无需查找您的特殊文件即可到达用户。

【讨论】:

  • 谢谢。将遵循黄金法则!
  • @eagertoLearn 您还可以遵循黄金法则并将答案标记为已回答以帮助他人;)
【解决方案2】:

绝对有可能:

import sys
sys.stderr = open("/tmp/errors.txt", "w")

所有后续打印到 stderr 的内容都将转到该文件。

您可能应该在 shell 级别而不是 Python 级别执行此操作,但它要灵活得多。

【讨论】:

  • 这具有(可能)不需要的副作用,即通过将 all 异常回溯通过管道将它们发送到请求者尝试打印到的文件中来使它们静音。
  • Well OP did 询问如何将所有标准错误重定向到一个文件。但我同意——就像我说的那样,这是个坏主意,最好在 shell 级别完成。
  • @MaxNoel:感谢您的解决方案。至少我知道这是可能的,但我不会这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多