Python中的"stderr"有什么意义?

What is the point of "stderr" in Python?

我是一名编程新手,我正在尝试了解 stdinstdoutstderr 的工作原理。据我了解,stdoutstderr 是我们可以直接从程序输出的两个不同的地方。我想我不明白为 stderr 的错误输出第二个 "stream" 有什么意义?为什么在常规 stdout 上没有错误? stderr 上的错误允许我做什么(基本上为什么 stderr 有用)?

支持不同的 stout 和 stderr 流有两个“要点”:

  1. 当您编写可以链接在一起的应用程序时(例如使用管道),您不希望“正常”输出与错误、警告、调试信息和其他“chit”混淆聊天”。将它们混合在同一个流中会使链/管道中的下一个程序变得困难。

    示例:

    $ cat 一些文件 | grep 不是 $ echo $?

    如果 cat 命令没有将其错误消息写入 stderr,那么如果 "some-file" 不存在,grep 命令将看到 "file not found" 消息。然后它会(错误地)匹配“not”,并错误地为管道设置 return 代码。构建处理此类问题的管道将 极其困难

  2. 独立的 stdout 和 stderr 流在(至少)UNIX 和类 UNIX 系统中得到支持,因为......嗯......从 1970 年代开始。它们是 POSIX 标准的一部分。如果一种新的编程语言的运行时库不支持这一点,那么它就会被认为是残废的;即不适合编写生产质量应用程序。

    (在编程语言的历史上,Python还是比较新的。)

但是,没有人会强迫您编写应用程序以将 stderr 用于其预期目的。 (好吧......也许你未来的同事会:-))

在 UNIX(以及 Linux 和其他 Posix 兼容系统)中,程序通常与管道结合使用,因此一个程序将另一个程序的输出作为输入。如果您要混合正常输出和错误信息,则每个程序都需要知道如何以不同于正常数据的方式处理来自其管道数据生产者的诊断信息。实际上,由于大量的程序组合,这是不可能的。 通过将错误信息写入 stderr,每个程序都可以让用户获取此信息,而无需将其从数据流中过滤掉以供管道中的下一个程序读取。