打印vs stderr

时间:2009-06-02 14:25:55

标签: python printing stderr

printstderr

是否有任何特定的优点或缺点?

4 个答案:

答案 0 :(得分:84)

print可以打印在任何类似文件的对象上,包括sys.stderr

print >> sys.stderr, 'Text'

sys.stderr用于错误而不是sys.stdout的优点是:

  • 如果用户将stdout重定向到某个文件,她仍然会在屏幕上看到错误。
  • 它没有缓冲,所以如果将sys.stderr重定向到日志文件,则在记录错误之前程序崩溃的可能性会降低。

这个答案用Python 2编写。 对于Python 3,请改用print('Text', file=sys.stderr)

答案 1 :(得分:34)

他们只是两件事。 print通常会转到sys.stdout。值得了解stdin, stdout, and stderr之间的区别 - 它们都有其用途。

特别是,stdout应该用于正常程序输出,而stderr应该仅保留用于错误消息(异常程序执行)。有一些用于拆分这些流的实用程序,它允许您的代码用户区分正常输出和错误。

答案 2 :(得分:31)

注意:这里有一些细微之处,包括流是否会转到交互式设备。最令人惊讶的是,在Python 3中,stderr是行缓冲的(至少在Unix中)。例如,在终端窗口中,以下内容在Python 2中每两秒打印一个数字:

for n in range(5):
    print >> sys.stderr, n,     # final comma to squelch newline character
    time.sleep(2)

而在Python 3中,以下内容在循环结束时将所有数字打印在一起:

for n in range(5):
    print(n, file=sys.stderr, end='')    # print n to sys.stderr with no newline char
    time.sleep(2)

答案 3 :(得分:2)

通过将脚本重定向到不同的文件来运行脚本时,分隔stderr和stdout很有用。我通常使用stderr来记录日志消息并跟踪程序的流程,但是使用stdout来获取更多有用的消息,我将在稍后使用它们。

另一种写入stderr的方法如下例所示:

import sys
sys.stderr.write("Error has occurred opening a file!")