打印vs stderr

Tyl*_*ler 28 python printing stderr

是否有任何具体的优势或劣势要么print还是stderr

Bas*_*ard 85

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

print >> sys.stderr, 'Text'
Run Code Online (Sandbox Code Playgroud)

使用sys.stderr错误代替的优点sys.stdout是:

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

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


Dan*_*Lew 34

他们只是两件不同的事情.print一般去sys.stdout.这是值得知道的区别stdin,stdout以及stderr -他们都有自己的用途.

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

  • 另请注意,stderr是无缓冲的,这可能很有用. (14认同)
  • 我会调整你的答案的措辞,用"非文本或非状态程序输出"替换"程序输出".在所有情况下,stderr也不应该被保留用于错误消息 - 例如,下载到stdout的程序,它被管道传送到另一个程序,但是将下载进度打印到stderr(它可以"突破"管道). (7认同)

Mit*_*del 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)
Run Code Online (Sandbox Code Playgroud)

而在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)
Run Code Online (Sandbox Code Playgroud)

  • 很有意思.我想知道为什么他们决定用Python 3走这条路? (4认同)