sys.exit的输出有时在print输出之前出现在终端

0 投票
1 回答
40 浏览
提问于 2025-04-12 06:56

运行这段代码多次后,有时我能得到预期的输出,但有时却会先出现“列表结束”的提示,这是因为出现了StopIteration,然后才是循环中的打印内容。

import sys

data = ['a', 'b', 'c']

def myf(*args):
    for arg in args:
        yield arg

generator_object = myf(*data)

while True:
    try:
        print(next(generator_object))
    except StopIteration:
        sys.exit('End of list')

我每次都希望看到的输出是“列表结束”在最后,因为这个异常应该是在生成器没有更多内容可以打印后才会出现。然而,大约一半的时间,我得到的却是这样的结果:

End of list
a
b
c

Process finished with exit code 1

多次运行这段代码的结果看起来是这样的:

GIF展示了多次执行的情况

这是为什么呢?

1 个回答

2

传给 sys.exit() 的字符串会写入错误输出(stderr),而 print() 默认是写入标准输出(stdout)。虽然最后这些输出都是显示在终端上,但由于这两个输出流是独立缓冲的,所以它们的顺序并不能保证。

文档可以在 这里 找到。

撰写回答