Files
yiliao/backend/run_report_generation.py

163 lines
5.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
统一的医疗报告生成脚本运行器
使用方法:
# 使用 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()