import argparse import logging import sys import signal from src.application import Application from src.utils.logging_config import setup_logging, get_logger logger = get_logger(__name__) # 配置日志 def parse_args(): """解析命令行参数""" parser = argparse.ArgumentParser(description='小智Ai客户端') # 添加界面模式参数 parser.add_argument( '--mode', choices=['gui', 'cli'], default='gui', help='运行模式:gui(图形界面) 或 cli(命令行)' ) # 添加协议选择参数 parser.add_argument( '--protocol', choices=['mqtt', 'websocket'], default='websocket', help='通信协议:mqtt 或 websocket' ) return parser.parse_args() def signal_handler(sig, frame): """处理Ctrl+C信号""" logger.info("接收到中断信号,正在关闭...") app = Application.get_instance() app.shutdown() sys.exit(0) def main(): """程序入口点""" # 注册信号处理器 signal.signal(signal.SIGINT, signal_handler) # 解析命令行参数 args = parse_args() try: # 日志 setup_logging() # 创建并运行应用程序 app = Application.get_instance() logger.info("应用程序已启动,按Ctrl+C退出") # 启动应用,传入参数 app.run( mode=args.mode, protocol=args.protocol ) # 如果是GUI模式且使用了PyQt界面,启动Qt事件循环 if args.mode == 'gui': # 获取QApplication实例并运行事件循环 try: from PyQt5.QtWidgets import QApplication qt_app = QApplication.instance() if qt_app: logger.info("开始Qt事件循环") qt_app.exec_() logger.info("Qt事件循环结束") except ImportError: logger.warning("PyQt5未安装,无法启动Qt事件循环") except Exception as e: logger.error(f"Qt事件循环出错: {e}", exc_info=True) except Exception as e: logger.error(f"程序发生错误: {e}", exc_info=True) return 1 return 0 if __name__ == "__main__": sys.exit(main())