You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Python替代bash中tee工具或编写智能包装脚本的方案

解决方案:替代bash封装,在Python中实现动态日志记录

方案1:Python内置实现类似tee的双输出功能(优先选择)

无需依赖bash,直接在主脚本myscript.py中添加日志重定向逻辑,即可同时将输出打印到控制台并写入动态生成的日志文件。

实现步骤:

  1. 解析参数生成日志目录:在脚本开头解析传入的args,根据参数计算出outdir路径,用os.makedirs确保目录存在(不存在则自动创建)。
  2. 自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:09:52