何时使用 sys.stdout 而不是 sys.stderr?
When to use sys.stdout instead of sys.stderr?
我的老板让我看一些旧代码,其中所有内容都被发送到 stderr。我知道 stderr 应该有警告和错误,但什么时候他们真的应该转到 stdout?
此程序是一项服务。它发送到 stderr 的一些消息是:
if pid is None:
message = "pidfile {0} is not running. \n"
sys.stderr.write(message.format(self.pidfile))
所以这是一个输出,对吧?关于成功与否的消息应该发送到标准输出,因为它不是错误?
然后我得到了另一个例外:
except OSError as err:
sys.stderr.write('fork #1 failed: {0}\n'.format(err))
sys.exit(1)
这是一个异常,所以它应该转到 stderr,因为它是一个错误?或者它应该转到标准输出,因为它是一条输出消息,只是说程序失败了?
我知道什么是 stdout 和 stderr --- 在提问之前我读了很多。我的问题是能够识别 哪些 消息应该发送到 stderr --- 只是致命错误,还是任何类型的错误消息?
两个示例都是错误消息,但一个只是 "Program is not running"。我在选择将此类消息发送到何处时遇到问题。
致命错误当然应该转到 stderr。正常输出应该转到标准输出。
信息性消息存在灰色区域,但一般来说,如果它们会使输出不可用,则不应转到标准输出。人们通常会将 stdout 指向文件,将 stderr 指向终端或日志文件。
您需要决定哪种划分最合理。
Tom Karzes 已经给了你一个正确的答案,但是要陈述一个更极端的立场...
我发现将 stdout
和 stderr
视为 "standard output" 和 "standard not-output" 会有所帮助。你说你想到了一个消息"should go to stdout
because it's not an error",但这是落后的:stdout
是进入门槛高的流,而不是stderr
。
消息应该发送到 stderr
(或日志文件,或除 stdout
之外的任何内容),除非它可以证明是所需输出的一部分 --- 用户实际 想要。如果您不能用 "The user asked for..."、 开头的句子来证明包含它是合理的,请不要 用它污染 stdout
。 (管道中的下一个过程将感谢您。)
很有可能,您的用户没有 运行 您的程序,因为他们想观看旋转的接力棒,或阅读一打 "Attempting to reconnect..." 消息,甚至想了解哪些分叉失败了,所以那些应该 而不是 在 stdout
.
最后,有些消息不应该进入 输出流。 stderr
可能正在被用户阅读,因此请尽量将其输出限制为用户现在 关心的内容。保持它没有 "situation normal" 消息,除非用户通过调高详细程度(通常是 --verbose
或 --debug
)特别要求它们。至少允许用户使用 --quiet
或 --silent
选项使非错误静音。大多数 "informational" 消息应该发送到日志文件而不是控制台。
我的老板让我看一些旧代码,其中所有内容都被发送到 stderr。我知道 stderr 应该有警告和错误,但什么时候他们真的应该转到 stdout?
此程序是一项服务。它发送到 stderr 的一些消息是:
if pid is None:
message = "pidfile {0} is not running. \n"
sys.stderr.write(message.format(self.pidfile))
所以这是一个输出,对吧?关于成功与否的消息应该发送到标准输出,因为它不是错误?
然后我得到了另一个例外:
except OSError as err:
sys.stderr.write('fork #1 failed: {0}\n'.format(err))
sys.exit(1)
这是一个异常,所以它应该转到 stderr,因为它是一个错误?或者它应该转到标准输出,因为它是一条输出消息,只是说程序失败了?
我知道什么是 stdout 和 stderr --- 在提问之前我读了很多。我的问题是能够识别 哪些 消息应该发送到 stderr --- 只是致命错误,还是任何类型的错误消息?
两个示例都是错误消息,但一个只是 "Program is not running"。我在选择将此类消息发送到何处时遇到问题。
致命错误当然应该转到 stderr。正常输出应该转到标准输出。
信息性消息存在灰色区域,但一般来说,如果它们会使输出不可用,则不应转到标准输出。人们通常会将 stdout 指向文件,将 stderr 指向终端或日志文件。
您需要决定哪种划分最合理。
Tom Karzes 已经给了你一个正确的答案,但是要陈述一个更极端的立场...
我发现将 stdout
和 stderr
视为 "standard output" 和 "standard not-output" 会有所帮助。你说你想到了一个消息"should go to stdout
because it's not an error",但这是落后的:stdout
是进入门槛高的流,而不是stderr
。
消息应该发送到 stderr
(或日志文件,或除 stdout
之外的任何内容),除非它可以证明是所需输出的一部分 --- 用户实际 想要。如果您不能用 "The user asked for..."、 开头的句子来证明包含它是合理的,请不要 用它污染 stdout
。 (管道中的下一个过程将感谢您。)
很有可能,您的用户没有 运行 您的程序,因为他们想观看旋转的接力棒,或阅读一打 "Attempting to reconnect..." 消息,甚至想了解哪些分叉失败了,所以那些应该 而不是 在 stdout
.
最后,有些消息不应该进入 输出流。 stderr
可能正在被用户阅读,因此请尽量将其输出限制为用户现在 关心的内容。保持它没有 "situation normal" 消息,除非用户通过调高详细程度(通常是 --verbose
或 --debug
)特别要求它们。至少允许用户使用 --quiet
或 --silent
选项使非错误静音。大多数 "informational" 消息应该发送到日志文件而不是控制台。