修复3个问题: 1. EasyOCR OOM降级CPU+重启恢复重检内存:_init_easyocr和_ensure_easyocr_subprocess添加内存检测,<2GB强制CPU;start()添加full_restart参数,用户手动启用时重置OOM计数重新评估GPU/CPU 2. PyInstaller exe闪退:spec入口改main.py,main.py添加EASYOCR_WORKER环境变量检测跳转worker逻辑;build.bat只清理build/build和dist不删spec/hooks 3. QQ OCR _processed_path未定义:补充ts和_processed_path变量定义 @
70 lines
2.0 KiB
Python
70 lines
2.0 KiB
Python
"""消息问答助手 — 入口"""
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
import signal
|
|
|
|
# ── Worker 模式检测:PyInstaller 打包后,exe 被调用来运行 worker 脚本时,
|
|
# 通过环境变量区分,避免 bootloader 执行 main() 导致闪退 ──
|
|
if os.environ.get("EASYOCR_WORKER") == "1":
|
|
# 直接执行 worker 逻辑,跳过 GUI 初始化
|
|
import easyocr_worker
|
|
easyocr_worker._main()
|
|
sys.exit(0)
|
|
|
|
# 确保在项目目录
|
|
os.chdir(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
# 配置日志
|
|
logging.basicConfig(
|
|
level=logging.DEBUG,
|
|
format="%(asctime)s [%(name)s] %(levelname)s: %(message)s",
|
|
datefmt="%H:%M:%S",
|
|
)
|
|
|
|
# 文件日志(持久化,便于排查)
|
|
_fh = logging.FileHandler("msgbot.log", encoding="utf-8", mode="w")
|
|
_fh.setLevel(logging.DEBUG)
|
|
_fh.setFormatter(logging.Formatter("%(asctime)s [%(name)s] %(levelname)s: %(message)s"))
|
|
|
|
# 过滤 comtypes 的 DEBUG 洪流
|
|
class ComtypesFilter(logging.Filter):
|
|
def filter(self, record):
|
|
return not record.name.startswith("comtypes") or record.levelno >= logging.WARNING
|
|
|
|
_fh.addFilter(ComtypesFilter())
|
|
logging.getLogger().addHandler(_fh)
|
|
|
|
logger = logging.getLogger("msgbot")
|
|
|
|
|
|
def main():
|
|
logger.info("消息问答助手启动中...")
|
|
|
|
# 动态导入 gui,避免 customtkinter 等缺失导致整个程序崩溃前无日志
|
|
try:
|
|
from gui import MsgBotApp
|
|
except ImportError as e:
|
|
logger.error(f"导入 GUI 失败: {e}")
|
|
logger.error("请先安装依赖: pip install -r requirements.txt")
|
|
sys.exit(1)
|
|
|
|
app = MsgBotApp()
|
|
|
|
# Ctrl+C 信号处理:Windows Tkinter mainloop 不响应 KeyboardInterrupt
|
|
# 需 signal handler 强制停止监控 + 退出
|
|
def _sigint_handler(sig, frame):
|
|
logger.info("收到 Ctrl+C,正在关闭...")
|
|
app.monitor.stop()
|
|
app.quit()
|
|
sys.exit(0)
|
|
|
|
signal.signal(signal.SIGINT, _sigint_handler)
|
|
|
|
app.mainloop()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|