寻求Python替代bash中tee工具或编写智能包装脚本的方案
解决方案:替代bash封装,在Python中实现动态日志记录
方案1:Python内置实现类似tee的双输出功能(优先选择)
无需依赖bash,直接在主脚本myscript.py中添加日志重定向逻辑,即可同时将输出打印到控制台并写入动态生成的日志文件。
实现步骤:
- 解析参数生成日志目录:在脚本开头解析传入的
args,根据参数计算出outdir路径,用os.makedirs确保目录存在(不存在则自动创建)。 - 自定义Tee流类:实现一个同时向控制台和文件写入内容的流对象,替换系统默认的
sys.stdout和sys.stderr。
代码示例:
import sys import os from typing import TextIO class TeeStream: def __init__(self, console_stream: TextIO, file_stream: TextIO): self.console = console_stream self.file = file_stream def write(self, data): self.console.write(data) self.file.write(data) # 强制刷新缓存,确保内容实时输出 self.console.flush() self.file.flush() def flush(self): self.console.flush() self.file.flush() # 第一步:解析参数生成outdir(替换为你实际的参数解析逻辑) import argparse parser = argparse.ArgumentParser() parser.add_argument('--target-arg', required=True, help='用于生成outdir的关键参数') args = parser.parse_args() # 根据参数动态生成日志目录 outdir = f"./results_{args.target_arg}" os.makedirs(outdir, exist_ok=True) log_path = os.path.join(outdir, 'log.txt') # 第二步:替换系统输出流为Tee流 with open(log_path, 'a', encoding='utf-8') as log_file: sys.stdout = TeeStream(sys.stdout, log_file) sys.stderr = TeeStream(sys.stderr, log_file) # 以下是原myscript.py的业务代码 print("测试输出:同时显示在控制台和日志文件") sys.stderr.write("错误信息:同样会被同步记录\n")
修改后直接运行python -u myscript.py --target-arg demo,即可自动生成对应目录的日志文件,完全替代原bash脚本功能。
方案2:Python包装脚本
如果不想修改主脚本,可编写一个包装脚本,先解析参数生成outdir,再调用主脚本并捕获输出模拟tee效果。
代码示例:
import sys import os import subprocess from typing import List # 解析参数生成outdir(复用主脚本的参数解析逻辑) import argparse parser = argparse.ArgumentParser() parser.add_argument('--target-arg', required=True) # 分离包装脚本参数与主脚本参数 args, remaining_args = parser.parse_known_args() outdir = f"./results_{args.target_arg}" os.makedirs(outdir, exist_ok=True) log_path = os.path.join(outdir, 'log.txt') # 构造调用主脚本的命令 cmd = [sys.executable, '-u', 'myscript.py'] + remaining_args + [f'--target-arg={args.target_arg}'] # 执行主脚本并同步输出到控制台与日志文件 with open(log_path, 'a', encoding='utf-8') as log_file: proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1) for line in proc.stdout: print(line, end='') log_file.write(line) proc.wait()
运行方式:python wrapper.py --target-arg demo,效果与原bash命令一致,且支持动态生成日志目录。
内容的提问来源于stack exchange,提问作者Shahar
相关产品推荐
相关产品推荐

