Files
yiliao/backend/run_report_generation.py

163 lines
5.2 KiB
Python
Raw Normal View History

"""
统一的医疗报告生成脚本运行器
使用方法
# 使用 extract_and_fill_report.py推荐 - 功能完整)
python run_report_generation.py --method extract
# 使用 fill_with_docxtpl.py简单模板填充
python run_report_generation.py --method docxtpl
# 强制重新提取(不使用缓存)
python run_report_generation.py --method extract --force
# 使用DeepSeek分析
python run_report_generation.py --method extract --deepseek
# 指定DeepSeek API Key
python run_report_generation.py --method extract --deepseek --api-key YOUR_KEY
"""
import sys
import os
from pathlib import Path
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
def print_config_info(method: str, force: bool, use_deepseek: bool):
"""打印配置信息"""
print("=" * 70)
print(" 医疗报告生成系统")
print("=" * 70)
print(f" 运行方式: {method.upper()}")
print(f" 强制刷新: {'' if force else '否(使用缓存)'}")
print(f" DeepSeek分析: {'启用 [OK]' if use_deepseek else '关闭'}")
# 检查关键文件
base_dir = Path(__file__).parent
template_complete = base_dir / "template_complete.docx"
template_docxtpl = Path(__file__).parent.parent / "template_docxtpl.docx"
config_file = base_dir / "abb_mapping_config.json"
print(f"\n 关键文件检查:")
print(f" - 模板文件 (extract): {'[OK] 存在' if template_complete.exists() else '[X] 缺失'}")
print(f" - 模板文件 (docxtpl): {'[OK] 存在' if template_docxtpl.exists() else '[X] 缺失'}")
print(f" - 配置文件: {'[OK] 存在' if config_file.exists() else '[X] 缺失'}")
if use_deepseek:
deepseek_key = os.environ.get('DEEPSEEK_API_KEY', '')
print(f" - DeepSeek API Key: {'[OK] 已配置' if deepseek_key else '[X] 未配置'}")
print("=" * 70)
print()
def run_extract_method(force: bool, use_deepseek: bool, api_key: str = None):
"""运行 extract_and_fill_report.py 方法"""
try:
from extract_and_fill_report import main as extract_main
extract_main(force_extract=force, use_deepseek=use_deepseek, deepseek_api_key=api_key)
except ImportError as e:
print(f"[ERROR] 导入失败: {e}")
print(" 请确保 extract_and_fill_report.py 文件存在")
sys.exit(1)
except Exception as e:
print(f"[ERROR] 运行失败: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
def run_docxtpl_method():
"""运行 fill_with_docxtpl.py 方法"""
try:
from fill_with_docxtpl import main as docxtpl_main
docxtpl_main()
except ImportError as e:
print(f"[ERROR] 导入失败: {e}")
print(" 请确保 fill_with_docxtpl.py 文件存在")
sys.exit(1)
except Exception as e:
print(f"[ERROR] 运行失败: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
def main():
"""主函数"""
# 解析命令行参数
method = 'extract' # 默认方法
force = False
use_deepseek = False
api_key = None
# 解析参数
args = sys.argv[1:]
i = 0
while i < len(args):
arg = args[i]
if arg in ['--method', '-m']:
if i + 1 < len(args):
method = args[i + 1]
i += 2
else:
print("[ERROR] --method 参数需要指定值: extract 或 docxtpl")
sys.exit(1)
elif arg in ['--force', '-f']:
force = True
i += 1
elif arg in ['--deepseek', '-d']:
use_deepseek = True
i += 1
elif arg in ['--api-key', '-k']:
if i + 1 < len(args):
api_key = args[i + 1]
i += 2
else:
print("[ERROR] --api-key 参数需要指定API Key")
sys.exit(1)
elif arg in ['--help', '-h']:
print(__doc__)
sys.exit(0)
else:
print(f"[ERROR] 未知参数: {arg}")
print(" 使用 --help 查看帮助信息")
sys.exit(1)
# 如果没有指定API Key尝试从环境变量获取
if use_deepseek and not api_key:
api_key = os.environ.get('DEEPSEEK_API_KEY', '')
if not api_key:
print("[WARNING] 使用DeepSeek需要提供API Key")
print(" 方法1: 设置环境变量 DEEPSEEK_API_KEY")
print(" 方法2: 使用参数 --api-key YOUR_KEY")
sys.exit(1)
# 验证方法
if method not in ['extract', 'docxtpl']:
print(f"[ERROR] 未知的方法: {method}")
print(" 支持的方法: extract, docxtpl")
sys.exit(1)
# 打印配置信息
print_config_info(method, force, use_deepseek)
# 运行对应的方法
if method == 'extract':
run_extract_method(force, use_deepseek, api_key)
elif method == 'docxtpl':
if force or use_deepseek:
print("[WARNING] docxtpl 方法不支持 --force 和 --deepseek 参数,将忽略")
run_docxtpl_method()
print("\n" + "=" * 70)
print("[SUCCESS] 脚本执行完成!")
print("=" * 70)
if __name__ == '__main__':
main()