Python中的"stderr"有什么作用?

7
我是一个编程新手,正在尝试理解stdin、stdout和stderr的工作原理。据我所知,stdout和stderr是程序中可以将输出定向到的两个不同位置。我想我不明白为什么要有第二个“流”用于只包含错误信息的stderr?为什么不能将错误信息放在常规的stdout中?将错误信息放在stderr中允许我做什么(基本上,为什么stderr很有用)?

你可能想忽略标准输出,但不想忽略标准错误。分离这两个流使你可以做到这一点,无论是记录日志、解析程序输出等等。 - jedwards
维基百科:标准错误是程序通常用于输出错误消息或诊断信息的另一个输出流。它是一个独立于标准输出的流,可以单独重定向。这解决了半谓词问题[...] stderr 的目的是不猜测而是知道输出和错误代码。 - meissner_
这是方便和连贯的问题,用户信息和崩溃信息不一样。 - lpozo
2
实际上,我看不出这个问题与Python有任何具体关系,它基本上是相同的概念,独立于编程语言。 - guidot
2个回答

5
支持独立的标准输出流和错误输出流有两个原因:
1. 当你编写可以链接在一起的应用程序(例如使用管道)时,你不希望“正常”输出与错误、警告、调试信息和其他“闲聊”混在一起。如果将它们混合在同一个流中,会给下一个程序在链/管道中带来困难。例如: $ cat some-file | grep not $ echo $?
如果cat命令没有将其错误消息写入stderr,则grep命令会看到“文件未找到”的消息(如果“some-file”不存在)。然后(不正确地)匹配“not”,并设置管道的返回代码不正确。构建能够处理这种情况的管道将非常困难。
2. 自从20世纪70年代以来,至少在UNIX和类UNIX系统中就支持了独立的标准输出流和错误输出流,并成为POSIX标准的一部分。如果新的编程语言运行时库不支持此功能,则会被认为是残缺的;即不适合编写生产质量的应用程序。(在编程语言的历史上,Python仍然相对较新。)
但是,没有人强制你编写应用程序以使用stderr进行其预期目的。(好吧...也许你未来的同事会这样要求 :-))

从技术上讲,语言的运行时不必支持它。在 POSIX 模型下,进程启动时会发现有两个文件正在写入。语言是否为任一或两个文件描述符提供默认绑定只是方便问题,而非正确性问题。 - chepner
正确。从技术上讲,它并没有错。然而,就我个人而言,除了玩具程序之外,我会毫不犹豫地拒绝使用任何现代编程语言,如果它在这方面出了差错...那些违反传统规则却没有充分理由的语言...往往难以生存。 - Stephen C
我的观点是,即使Python没有提供sys.stdout,你也可以使用stdout = open(1, "w")自己定义它。这不是Python提供的东西,而是你的Python实现运行的平台提供的。 - chepner
尽管在某些时候,我猜语言必须提供一些访问继承文件描述符的功能,所以我会让步这一点。 - chepner
假设一下。但你假定你可以这样做:open(1, "w")。例如,你不能在一个没有将fd值公开为整数的语言中这样做。比如Java。但这只是假设,因为Python确实支持stderr。而我的真正观点是,一个不支持正确处理stderr的编程语言将无法生存。 - Stephen C

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

管道只是众多重定向操作之一。我模糊地记得 cat nosuchfile >stdout 比管道还要古老。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接