|
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 |
|
) |
|
|
|
|
|
if args.mode == 'gui': |
|
|
|
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()) |