print 与 stderr

29 投票
4 回答
62567 浏览
提问于 2025-04-15 11:59

使用printstderr各有什么特别的优缺点吗?

4 个回答

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)
89

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

print >> sys.stderr, 'Text'

使用 sys.stderr 来输出错误信息,而不是 sys.stdout 有以下好处:

  • 如果用户把标准输出(stdout)重定向到一个文件,她仍然可以在屏幕上看到错误信息。
  • 它没有缓冲区,这样如果 sys.stderr 被重定向到一个日志文件,就更不容易在错误被记录之前程序崩溃。

这个回答是针对 Python 2 的。如果你使用的是 Python 3,请用 print('文本', file=sys.stderr) 来替代。

35

这两者其实是完全不同的东西。print 通常是输出到 sys.stdout。了解 stdinstdoutstderr 之间的区别是很重要的,因为它们各自有不同的用途。

具体来说,stdout 用于正常的程序输出,而 stderr 则专门用来显示错误信息(也就是程序执行出错时的情况)。有一些工具可以将这些输出流分开,这样使用你代码的人就能区分正常输出和错误信息。

撰写回答