Mac系统下如何将交互式Python日志脚本输出同步到终端和文本文件
解决方案汇总
方案1:直接用shell命令实现(无需修改Python脚本,无需额外编写shell脚本)
直接用tee命令配合Python的无缓冲模式运行即可,tee命令原生支持把输入内容同时输出到终端(标准输出)和指定文件:
python -u your_script.py 2>&1 | tee output.log
参数说明:
-u参数让Python关闭标准输出、标准错误的行缓冲,确保交互式输入提示、运行日志能实时输出到终端,不会出现输出卡顿延迟的问题2>&1作用是把标准错误(报错、警告信息)也合并到标准输出流中,确保异常信息也能被保存到日志文件tee output.log会把所有输出同时打印到终端和写入output.log文件;如果需要追加内容而不是覆盖旧日志,替换为tee -a output.log即可
方案2:封装为独立shell脚本
如果需要频繁调用该Python脚本,可以把逻辑封装成固定的shell脚本,比如新建run_with_log.sh,内容如下:
#!/bin/bash # 替换为你的Python脚本实际路径 PY_SCRIPT="./your_interactive_script.py" # 替换为你要保存的日志文件路径 LOG_FILE="./python_run_log.log" echo "脚本启动,日志将同步输出到终端和 $LOG_FILE" python -u "$PY_SCRIPT" 2>&1 | tee "$LOG_FILE" echo "脚本运行结束,完整日志已保存至 $LOG_FILE"
给脚本添加执行权限:chmod +x run_with_log.sh
之后直接运行./run_with_log.sh即可,交互式输入功能完全不受影响。
可选方案:修改Python脚本自身实现双输出
如果你不想依赖shell工具,也可以直接在Python脚本开头添加双输出逻辑,原有脚本业务代码不需要做任何修改:
import sys class DualOutput: def __init__(self, log_path): self.terminal = sys.stdout self.log_file = open(log_path, "a", encoding="utf-8") def write(self, message): self.terminal.write(message) self.log_file.write(message) self.flush() def flush(self): self.terminal.flush() self.log_file.flush() # 替换标准输出、标准错误流 sys.stdout = DualOutput("output.log") sys.stderr = DualOutput("output.log")
添加完成后直接运行Python脚本,输出就会同时打印到终端和写入日志文件,交互式输入功能可正常使用。
内容的提问来源于stack exchange,提问作者BTBts
相关产品推荐
相关产品推荐

