【问题标题】:print vs stderr打印与标准错误
【发布时间】:2023-04-06 20:46:01
【问题描述】:

printstderr 有什么特定的优点或缺点吗?

【问题讨论】:

    标签: python printing stderr


    【解决方案1】:

    它们只是两种不同的东西。 print 通常转到 sys.stdout。值得了解stdin, stdout, and stderr 之间的区别——它们都有自己的用途。

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

    【讨论】:

    • 还要注意stderr是无缓冲的,这很有用。
    • 我会调整您答案的措辞,将“程序输出”替换为“非文本或非状态程序输出”。 stderr 也不应该在所有情况下都保留用于错误消息 - 例如,下载到 stdout 的程序通过管道传输到另一个程序,但将下载进度打印到 stderr(它会“突破”管道)。
    • @JimB 在什么意义上?
    【解决方案2】:

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

    print >> sys.stderr, 'Text'
    

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

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

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

    【讨论】:

    • 在 python 3.5 和 Windows 中,流是交互式的,所以 sys.stderr 是根据 docs 进行行缓冲的
    【解决方案3】:

    请注意:这里有一些微妙之处,包括流是否会进入交互式设备。最大的惊喜是在 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)
    

    【讨论】:

    • 非常有趣。我想知道他们为什么决定使用 Python 3 走这条路?
    • 它是在终端上缓冲的行,并在写入文件时完全缓冲。 :( 失败。
    • 您可以通过为print 指定flush=True 来禁用缓冲(从Python 3.3 开始)。
    【解决方案4】:

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

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

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

    【讨论】:

    • 酷! :) 日志 = sys.stderr.write;日志(“你好”)
    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2010-11-09
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多