Python 中如何把输出打印到标准错误(stderr)?
Python 输出到 stderr:print(..., file=sys.stderr) 最简洁,sys.stderr.write() 更底层。logging 默认就输出到 stderr。本文介绍各种方式。
最简单:print("错误信息", file=sys.stderr)。logging 模块的默认行为也是输出到 stderr。
print 到 stderr
import sys
print("这是一条错误信息", file=sys.stderr)
file 参数指定输出目标,默认是 sys.stdout。
sys.stderr.write()
import sys
sys.stderr.write("这是一条错误信息\n")
更底层的方式。注意 write() 不会自动加换行,需要手动加 \n。
logging(推荐)
logging 默认输出到 stderr,带格式和级别:
import logging
logging.basicConfig(level=logging.WARNING)
logging.error("这是一条错误信息")
什么时候用 stderr?
- 错误信息、警告:正常输出走 stdout,错误走 stderr,方便分开重定向;
- 管道脚本:
python script.py | grep pattern时,stderr 不会被管道捕获,错误信息直接显示在终端。
# 只把错误信息写入日志文件
python script.py 2> error.log
# stdout 写文件,stderr 显示在终端
python script.py > output.log
观测云对照
容器环境中,stdout 和 stderr 都会被 Docker 的日志驱动收集,观测云 DataKit 采集容器日志时两者都会收到。不需要刻意区分,但良好的习惯是正常日志走 stdout、错误走 stderr。
常见问题(FAQ)
Q:stdout 和 stderr 在终端上看起来有区别吗?
A:默认都显示在终端上,看起来一样。区别在于重定向时:> 只重定向 stdout,2> 重定向 stderr。
Q:print 到 stderr 会影响性能吗?
A:不会,和 print 到 stdout 性能一样。
Q:Jupyter Notebook 中 stderr 输出在哪?
A:在 cell 输出区域中以红色背景显示。