为何Python中print加flush=True后,异常前输出仍偶尔乱序?
为什么Python中print加flush=True仍偶尔出现输出顺序错乱?
问题场景
原代码:
print("Dividing 0 by 0...") res = 0/0
偶尔会出现输出顺序错乱的情况,异常信息先被打印,print的内容后出现:
Traceback (most recent call last): File "[...]/scratches/scratch_8.py", line 2, in <module> res = 0/0 ZeroDivisionError: division by zero Dividing 0 by 0...
尝试在print中添加flush=True参数后,问题仍偶尔出现:
print("Dividing 0 by 0...", flush = True) res = 0/0
原因分析
核心问题在于标准输出(stdout)和标准错误(stderr)是两个完全独立的输出流:
print()函数默认将内容输出到stdout,哪怕你用flush=True刷新了stdout的缓冲区,也只影响这一个流。- Python的异常回溯信息默认输出到stderr,它有自己独立的缓冲机制,刷新时机由系统或Python解释器控制,和stdout的刷新操作互不影响。
两者的输出内容最终显示在终端的顺序,取决于系统何时分别把两个流的缓冲区内容刷到终端,和你是否刷新stdout没有直接关联。
解决方法
可以通过让两个流使用一致的缓冲策略或合并流来解决:
- 方法1:启动Python时禁用全局缓冲
运行脚本时添加-u参数,强制stdout和stderr都使用无缓冲模式:python -u your_script.py - 方法2:代码中合并stderr到stdout
把标准错误流重定向到标准输出流,让两者共用同一个缓冲区:import sys sys.stderr = sys.stdout print("Dividing 0 by 0...", flush=True) res = 0/0
内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig
相关产品推荐
相关产品推荐

