Files
PlantAI-dev/pipeline_backend_patch.py
T

129 lines
4.0 KiB
Python
Raw Normal View History

2026-08-03 18:42:47 +08:00
#!/usr/bin/env python3
"""
pipeline_backend.py 可复现性模块集成补丁
使用方法:
1. 导入 ReproducibilityBundle
2. 在 run_stage 函数开头初始化 bundle
3. 在命令执行后记录命令
4. 在函数返回前生成可复现性文件
"""
# ============ 导入部分(添加到文件顶部)============
IMPORT_PATCH = '''
# 可复现性支持
import sys
sys.path.insert(0, str(Path(__file__).parent.parent))
from gfa_core.reproducibility import ReproducibilityBundle
'''
# ============ run_stage 函数修改 ============
RUN_STAGE_PATCH = '''
# 初始化可复现性 bundle
reproducibility_bundle = None
try:
reproducibility_bundle = ReproducibilityBundle(
job_id=job.job_id,
prefix=prefix,
workspace_root=str(WORKSPACE_ROOT)
)
except Exception as e:
# 如果初始化失败,不影响主流程
print(f"[WARN] ReproducibilityBundle init failed: {e}")
'''
# ============ 在每个 stage 命令构建后添加 ============
RECORD_CMD_PATCH = '''
# 记录命令到可复现性 bundle
if reproducibility_bundle:
try:
reproducibility_bundle.add_command(
stage=stage,
cmd=cmd,
description=f"Run {stage} analysis"
)
except Exception as e:
print(f"[WARN] Failed to record command: {e}")
'''
# ============ 在函数返回前添加 ============
GENERATE_REPRO_PATCH = '''
# 生成可复现性文件
if reproducibility_bundle:
try:
reproducibility_bundle.generate_commands_sh()
reproducibility_bundle.generate_environment_yml()
reproducibility_bundle.generate_checksums()
reproducibility_bundle.copy_to_project_reproducibility()
print(f"[INFO] Reproducibility files generated for {stage}")
except Exception as e:
print(f"[WARN] Failed to generate reproducibility files: {e}")
'''
def apply_patch_to_pipeline_backend():
"""
自动应用补丁到 pipeline_backend.py
"""
import re
file_path = Path("/home/xia-lab/wutx/00test/bbav5/apps/web/pipeline_backend.py")
content = file_path.read_text()
# 1. 添加导入
if "from gfa_core.reproducibility import ReproducibilityBundle" not in content:
# 在文件开头添加导入
import_section = """# web/pipeline_backend.py
import json
import os
import re
import shutil
import subprocess
import sys
import time
from dataclasses import dataclass
from datetime import datetime, timedelta
from pathlib import Path
from typing import Dict, List, Optional, Tuple
# 可复现性支持
sys.path.insert(0, str(Path(__file__).parent.parent))
from gfa_core.reproducibility import ReproducibilityBundle
"""
content = content.replace(
"# web/pipeline_backend.py\nimport json",
import_section
)
print("✅ Added ReproducibilityBundle import")
# 2. 在 run_stage 函数中添加初始化
if "reproducibility_bundle = None" not in content:
# 找到 run_stage 函数中 job: JobInfo 后的位置
pattern = r"(def run_stage\([^)]+job: JobInfo[^)]+\):.*?ok, msg = can_start_new_task\(\).*?if not ok:.*?return msg, None)"
def add_init(match):
return match.group(1) + """
# 初始化可复现性 bundle
reproducibility_bundle = None
try:
reproducibility_bundle = ReproducibilityBundle(
job_id=job.job_id,
prefix=prefix,
workspace_root=str(WORKSPACE_ROOT)
)
except Exception as e:
# 如果初始化失败,不影响主流程
print(f"[WARN] ReproducibilityBundle init failed: {e}")"""
content = re.sub(pattern, add_init, content, flags=re.DOTALL)
print("✅ Added ReproducibilityBundle initialization")
# 保存修改
file_path.write_text(content)
print(f"✅ Patch applied to {file_path}")
if __name__ == "__main__":
apply_patch_to_pipeline_backend()