在Python里,内置的print()函数默认把内容写到sys.stdout,也就是标准输出流。但很多场景下,比如写命令行工具或后台服务,我们希望提示、错误、调试信息走标准错误流sys.stderr,从而和正常数据输出分离。下面介绍几种让print()默认输出到stderr的实用做法。

方法一:运行时替换sys.stdout
最简单粗暴的方式是在程序启动时把sys.stdout指向sys.stderr。之后所有未指定file参数的print()都会写到stderr。
import sys
# 将标准输出重定向到标准错误
sys.stdout = sys.stderr
print("这条消息会输出到stderr")
print("同样也是stderr", "支持多个参数")
这种方法的缺点是全局修改,后续如果确实需要写stdout,要自己保存原来的sys.stdout再恢复。
方法二:使用functools.partial包装print
如果不想动全局的sys.stdout,可以用partial把print的file参数固定为sys.stderr,形成一个新的函数。
from functools import partial
import sys
# 创建一个新的打印函数,默认输出到stderr
eprint = partial(print, file=sys.stderr)
eprint("这是通过eprint输出的stderr内容")
eprint("带结束符", end="!n")
在代码里用eprint代替print即可,原有print()行为不受影响,适合局部使用。
方法三:在程序入口统一设置
对于小型脚本,可以在main函数开头做重定向,并在结束前恢复,避免影响被调用的库。
import sys
def main():
old_stdout = sys.stdout
sys.stdout = sys.stderr
try:
print("程序日志写到stderr")
# 正常业务逻辑
finally:
sys.stdout = old_stdout
if __name__ == "__main__":
main()
不同方法对比
| 方式 | 影响范围 | 适用场景 |
|---|---|---|
| 替换sys.stdout | 全局 | 简单脚本、临时调试 |
| partial包装 | 局部函数 | 长期维护、需区分输出 |
| 入口设置并恢复 | 主流程内 | 兼顾库兼容性的脚本 |
小结
让print()默认输出到stderr并不是修改内置函数本身,而是通过重定向流或用partial固定file参数来实现。实际项目中推荐用eprint这种显式函数,代码可读性更好,也不会干扰依赖stdout的第三方库。