ocr_evaluation.cli.main 源代码

#!/usr/bin/env python3
"""
OCR评估框架主CLI入口
"""

import argparse
import sys
from pathlib import Path
from typing import Optional, List

from .commands import EvaluateCommand, CompareCommand, ConfigCommand
from ..config import get_config, PROJECT_ROOT
from ..utils import get_logger


[文档] def create_cli_parser() -> argparse.ArgumentParser: """创建CLI参数解析器""" parser = argparse.ArgumentParser( prog='ocr-evaluation', description='OCR模型评估和对比框架', formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" 示例: # 使用PaddleOCR评估图片 ocr-evaluation evaluate paddleocr -i ./images -o ./reports # 对比两个模型 ocr-evaluation compare paddleocr qwen_vl -i ./images # 显示配置 ocr-evaluation config show # 生成默认配置文件 ocr-evaluation config generate -o my_config.yaml 更多信息请访问: https://github.com/forayl/ocr-evaluation """ ) # 添加版本信息 parser.add_argument( '--version', action='version', version='OCR Evaluation Framework v1.0.0' ) # 创建子命令 subparsers = parser.add_subparsers( dest='command', help='可用命令', metavar='COMMAND' ) # 评估命令 evaluate_parser = subparsers.add_parser( 'evaluate', help='评估OCR模型', description='在指定数据集上评估单个OCR模型的性能' ) EvaluateCommand.add_arguments(evaluate_parser) EvaluateCommand().add_common_arguments(evaluate_parser) # 对比命令 compare_parser = subparsers.add_parser( 'compare', help='对比多个OCR模型', description='在相同数据集上对比多个OCR模型的性能' ) CompareCommand.add_arguments(compare_parser) CompareCommand().add_common_arguments(compare_parser) # 配置命令 config_parser = subparsers.add_parser( 'config', help='管理配置', description='查看、设置或生成配置文件' ) ConfigCommand.add_arguments(config_parser) ConfigCommand().add_common_arguments(config_parser) # 添加全局参数 parser.add_argument( '--project-root', type=Path, help='项目根目录路径' ) return parser
[文档] def show_welcome(): """显示欢迎信息""" print("🔍 OCR评估框架 v1.0.0") print("=" * 50) print()
[文档] def show_help_hint(parser: argparse.ArgumentParser): """显示帮助提示""" print("使用 --help 查看详细帮助信息") print() print("快速开始:") print(" ocr-evaluation evaluate paddleocr # 评估PaddleOCR") print(" ocr-evaluation compare paddleocr qwen_vl # 对比模型") print(" ocr-evaluation config show # 查看配置")
[文档] def validate_project_structure(project_root: Path) -> bool: """验证项目结构""" required_dirs = ['data', 'data/images'] for dir_name in required_dirs: dir_path = project_root / dir_name if not dir_path.exists(): print(f"❌ 缺少必要目录: {dir_path}") return False return True
[文档] def setup_project_environment(project_root: Optional[Path] = None): """设置项目环境""" if project_root: # 验证项目结构 if not validate_project_structure(project_root): print("❌ 项目结构不完整,请检查必要目录是否存在") return False # 创建必要目录 try: from ..config import IMAGES_DIR, REPORTS_DIR, OUTPUTS_DIR for directory in [IMAGES_DIR, REPORTS_DIR, OUTPUTS_DIR]: directory.mkdir(parents=True, exist_ok=True) return True except Exception as e: print(f"❌ 创建项目目录失败: {e}") return False
[文档] def main(argv: Optional[List[str]] = None) -> int: """主入口函数 Args: argv: 命令行参数列表,如果为None则使用sys.argv[1:] Returns: int: 退出码,0表示成功,非0表示失败 """ try: # 解析命令行参数 parser = create_cli_parser() args = parser.parse_args(argv) # 显示欢迎信息 show_welcome() # 检查是否指定了命令 if not args.command: print("❌ 请指定要执行的命令") print() show_help_hint(parser) return 1 # 设置项目环境 if not setup_project_environment(args.project_root): return 1 # 执行对应的命令 if args.command == 'evaluate': command = EvaluateCommand() return command.run(args) elif args.command == 'compare': command = CompareCommand() return command.run(args) elif args.command == 'config': command = ConfigCommand() return command.run(args) else: print(f"❌ 未知命令: {args.command}") return 1 except KeyboardInterrupt: print("\n❌ 用户中断操作") return 1 except Exception as e: print(f"❌ 程序执行出错: {e}") # 在调试模式下显示完整错误信息 if '--verbose' in (argv or sys.argv): import traceback traceback.print_exc() return 1
[文档] def cli_entry(): """CLI入口点,用于setuptools entry_points""" sys.exit(main())
if __name__ == '__main__': sys.exit(main())