90 lines
2.4 KiB
Python
Raw Normal View History

2025-07-18 13:14:28 +08:00
import argparse
import io
import signal
import sys
from src.application import Application
from src.utils.logging_config import get_logger, setup_logging
logger = get_logger(__name__)
# 配置日志
def parse_args():
"""解析命令行参数."""
# 确保sys.stdout和sys.stderr不为None
if sys.stdout is None:
sys.stdout = io.StringIO()
if sys.stderr is None:
sys.stderr = io.StringIO()
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())