如何在Python中同时将tqdm控制台输出记录到文件并显示进度条
实现tqdm进度条同时显示在控制台并记录到文件
以下几种方法可以解决你的需求:
方法一:自定义双输出类
创建一个类模拟tee命令的功能,让tqdm的输出同时流向控制台和文件:
import time import sys from tqdm import tqdm class TeeLogger: def __init__(self, file_path): self.console = sys.stdout self.log_file = open(file_path, 'w') def write(self, message): self.console.write(message) self.log_file.write(message) self.log_file.flush() # 实时写入文件,避免缓存 def flush(self): self.console.flush() self.log_file.flush() # 使用示例 tee = TeeLogger('/tmp/temp_log.log') for x in tqdm(range(10), file=tee): time.sleep(0.5) tee.log_file.close()
这个类会将tqdm的每一次输出同步到控制台和日志文件,和控制台的动态进度更新完全对应。
方法二:终端命令行重定向
如果是在终端运行脚本,无需修改代码,直接用tee命令重定向输出:
python your_script.py 2>&1 | tee /tmp/temp_log.log
2>&1会将标准错误(tqdm默认输出到stderr)合并到标准输出,再通过tee同时输出到控制台和日志文件,脚本里保持最初的tqdm代码即可。
方法三:利用tqdm的回调函数
通过callback参数捕获每一次进度更新,同步写入文件:
import time from tqdm import tqdm log_file = open('/tmp/temp_log.log', 'w') def log_progress(bar): progress_str = str(bar) log_file.write(f"{progress_str}\n") log_file.flush() for x in tqdm(range(10), callback=log_progress): time.sleep(0.5) log_file.close()
每次进度条更新时,回调函数会把当前进度的字符串写入文件,控制台正常显示动态进度条,日志文件会保存每一步的进度记录。
内容的提问来源于stack exchange,提问作者The Singularity
相关产品推荐
相关产品推荐

