#!/usr/bin/env python3 """ run_pipeline.py 串联三步处理脚本: 1) 从 Excel 抽取币 / p / v 与绿色方块(使用 read_excel.py 中的函数) 2) 根据 found_*.xlsx 生成 C# 关卡代码(调用 write_code.py 的 main) 3) 根据 found_方块.xlsx 生成 prefab(调用 make_prefab.py 的 main) 用法示例: python run_pipeline.py --excel global.xlsx --sheet Sheet2 --start-i 80316 python run_pipeline.py --steps 1,2 # 只执行前两步 可配置项:--start-i, --excel, --sheet, --template, --steps 注意:本脚本会 import 现有模块并调用它们的 main 函数 / 函数。 请确保安装依赖:openpyxl, pandas """ import argparse import importlib import sys import os from typing import List def parse_steps(s: str) -> List[int]: parts = [p.strip() for p in s.split(",") if p.strip()] steps = [] for p in parts: if p.isdigit(): steps.append(int(p)) elif p.lower() == "all": return [1, 2, 3] return steps def main(): parser = argparse.ArgumentParser(description="Run pipeline: read_excel -> write_code -> make_prefab") parser.add_argument("--excel", default="global.xlsx", help="输入 Excel 文件 (默认: global.xlsx)") parser.add_argument("--sheet", default="Sheet2", help="Excel 的 sheet 名称 (默认: Sheet2)") parser.add_argument("--start-i", type=int, default=80316, help="A 列地图号的起始值 (默认: 80316)") parser.add_argument("--template", default="Level90116.prefab", help="prefab 模板文件 (默认: Level90116.prefab)") parser.add_argument("--steps", default="all", help="要执行的步骤,例如: 1,2,3 或 all (默认: all)") parser.add_argument("--output-levels", default="generated_levels.cs", help="生成的 C# 文件名 (默认: generated_levels.cs)") args = parser.parse_args() steps = parse_steps(args.steps) if not steps: steps = [1, 2, 3] # 确保当前工作目录是脚本所在目录(便于相对路径文件读写) script_dir = os.path.dirname(os.path.abspath(__file__)) os.chdir(script_dir) print("流水线开始,工作目录:", script_dir) print("将执行步骤:", steps) # STEP 1: run read_excel.find_cells_with_currency_xlsx for 币, p, v if 1 in steps: print("\n=== 步骤 1: 从 Excel 中抽取 币 / p / v 与绿色方块 ===") try: import read_excel except Exception as e: print("无法导入 read_excel.py:", e) sys.exit(1) # 调用函数(函数会自己写出 found_币.xlsx / found_p.xlsx / found_v.xlsx / found_方块.xlsx) found_coin = read_excel.find_cells_with_currency_xlsx(args.excel, sheet_name=args.sheet, start_i=args.start_i, search_term="币") found_p = read_excel.find_cells_with_currency_xlsx(args.excel, sheet_name=args.sheet, start_i=args.start_i, search_term="p") found_v = read_excel.find_cells_with_currency_xlsx(args.excel, sheet_name=args.sheet, start_i=args.start_i, search_term="v") color_summary = read_excel.scan_color_blocks(args.excel, sheet_name=args.sheet, start_i=args.start_i) if color_summary: block_len = len(color_summary.get("block", [])) water_len = len(color_summary.get("water", [])) wall_len = len(color_summary.get("wall", [])) jump_len = len(color_summary.get("jump", [])) print( "步骤1完成:发现 币 {0} / p {1} / v {2} 条目;颜色格子 block {3} / water {4} / wall {5} / jump {6}.".format( len(found_coin), len(found_p), len(found_v), block_len, water_len, wall_len, jump_len ) ) else: print(f"步骤1完成:发现 币 {len(found_coin)} / p {len(found_p)} / v {len(found_v)} 条目。") # STEP 2: run write_code.py to generate generated_levels.cs if 2 in steps: print("\n=== 步骤 2: 使用 found_*.xlsx 生成 C# 关卡文件 ===") try: import write_code except Exception as e: print("无法导入 write_code.py:", e) sys.exit(1) # 允许覆盖 write_code 中的文件名常量 write_code.FILE_P = getattr(write_code, 'FILE_P', 'found_p.xlsx') write_code.FILE_V = getattr(write_code, 'FILE_V', 'found_v.xlsx') write_code.FILE_COIN = getattr(write_code, 'FILE_COIN', 'found_币.xlsx') write_code.OUTPUT_FILE = args.output_levels # 调用其 main() 来生成文件 try: write_code.main() print(f"步骤2完成:已生成 {args.output_levels}") except Exception as e: print("执行 write_code.main() 时出错:", e) sys.exit(1) # STEP 3: run make_prefab.py to generate prefab files if 3 in steps: print("\n=== 步骤 3: 使用 found_方块.xlsx 生成 prefab ===") try: import make_prefab except Exception as e: print("无法导入 make_prefab.py:", e) sys.exit(1) # 覆盖模板与输入 Excel 路径 make_prefab.EXCEL_PATH = getattr(make_prefab, 'EXCEL_PATH', 'found_方块.xlsx') make_prefab.TEMPLATE_PREFAB = args.template try: make_prefab.main() print("步骤3完成:Prefab 已生成到 GeneratedPrefabs/ 目录") except Exception as e: print("执行 make_prefab.main() 时出错:", e) sys.exit(1) print("\n流水线全部完成。") if __name__ == '__main__': main()