
本文介绍一种专业、安全的 Python 输出分流方案:使用自定义 Tee 类实现 stdout 的双重重定向,既保持终端实时可见性,又自动持久化到日志文件,支持上下文管理与异常安全关闭。
本文介绍一种专业、安全的 python 输出分流方案:使用自定义 `tee` 类实现 stdout 的双重重定向,既保持终端实时可见性,又自动持久化到日志文件,支持上下文管理与异常安全关闭。
在开发和运维场景中,常需同时查看脚本运行时的控制台输出,并将完整日志保存至文件供后续分析。直接赋值 sys.stdout = file 会完全屏蔽终端显示,且缺乏异常保护机制——这正是原始方法失效的根本原因。理想方案应满足三点:实时双写(terminal + file)、作用域可控、资源自动清理。
为此,我们实现一个轻量级 Tee 类(灵感源自 Unix tee 命令),它作为 sys.stdout 的代理,将所有 write() 调用同步转发至原始 stdout 和指定日志文件:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
import sys
class Tee:
def __init__(self, file):
self.file = file
def write(self, text):
# 同时写入原始 stdout 和日志文件
self.orig_stdout.write(text)
self.file.write(text)
# 确保即时刷新,避免缓冲延迟
self.orig_stdout.flush()
self.file.flush()
def start(self):
self.orig_stdout = sys.stdout
sys.stdout = self
def flush(self):
self.orig_stdout.flush()
self.file.flush()
def close(self):
sys.stdout = self.orig_stdout
__enter__ = start
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
✅ 推荐用法:上下文管理器(最安全)
利用 with 语句确保即使发生异常,sys.stdout 也能自动恢复,日志文件正常关闭:
with open("log.txt", "w") as log_file, Tee(log_file):
print("这条消息会同时出现在终端和 log.txt 中")
print("错误信息、警告等也一并捕获")
print("此行仅输出到终端 —— stdout 已自动还原")
⚠️ 注意事项
- 日志文件模式建议使用 "w"(覆盖写入)或 "a"(追加写入),避免 "r+" 导致的定位问题;
- Tee 实例必须在 with 块内调用 start()(即通过 __enter__ 触发),否则重定向不生效;
- 若需跨模块/长时间运行的日志记录,可结合 atexit 注册清理逻辑(但上下文管理器已覆盖绝大多数场景);
- flush() 调用至关重要——尤其在脚本意外终止时,能最大限度减少日志丢失。
? 进阶提示:如需记录时间戳、区分 stdout/stderr 或支持多级日志,建议直接使用标准库 logging 模块配置 StreamHandler + FileHandler,而非手动重定向 stdout——Tee 方案适用于快速调试与简单脚本日志化,而 logging 更适合生产环境的结构化日志管理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










