Windows 守护 GUI 单文件打包器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_9aa69e66/pyinstaller-win-gui 到当前 AI 助手。
技能介绍
要解决的问题
把「一个 Python 服务 + 一个看门狗」变成一个能双击运行的 Windows 单文件 GUI,常见翻车点集中在四处:
- 打包后多进程困惑:PyInstaller 单文件模式会产生引导外壳进程和应用进程,任务管理器里看到两个同名 exe 是正常现象。
- 多实例互杀:保活逻辑里无脑
taskkill /F /IM cloudflared.exe先杀全部同类进程,一旦两个管理器并存就会互相拆台,引发隧道重启风暴。 - 隐蔽认证失败:令牌文件带 UTF-8 BOM 时,用
open(encoding='utf-8')会把三个不可见字节混进令牌,表现为 Cloudflare 报 token invalid、公网 502/530 抖动。 - 状态脱节:管理器重启或多实例后,内存布尔
self.running与真实进程不一致,点「停止系统」直接走"未运行"分支,根本没杀进程。
核心能力
- 纯标准库实现:GUI 用 tkinter,保活用
threading+subprocess,配置读写用json/winreg,不引入第三方依赖,打包体积小、运行稳。 - 单文件窗口打包:
--onefile --windowed产出双击即用的窗口 exe,不带控制台黑框。 - 端口互斥防多开:占用一个本地 TCP 端口当互斥锁,比文件锁干净,重复双击或开机自启第二份会被静默拦截。
- 真实进程保活:保活前先
detect_running()确认真实状态,只在"进程缺失 / 公网不可达且冷却已过"时才重启,绝不无脑 kill 全部。 - 令牌 BOM 防护:统一用
utf-8-sig读令牌和配置文件,可搭配 PowerShell 检查文件头三个字节是否为0xEF,0xBB,0xBF。 - 开机自启:写入
HKCU\...\Run注册表项,值带--minimized,无需管理员权限且开机不弹窗。 - 关窗即最小化:点 × 不销毁保活线程,改最小化到任务栏;另设「退出管理器」和「停止系统」两个语义明确的按钮。
- 独立打包 venv:pyinstaller 装在独立 venv 里,不污染被守护服务的运行环境。
适用边界与注意点
- 管理器只负责「启动 / 停止 / 看护」既有服务脚本,升级服务代码无需改动管理器本身。
- 精确清理进程依赖按命令行匹配的
Get-CimInstance方式,不要用netstat解析 LISTENING 的 PID,曾因此误杀主进程。 - 本技能配套
win-powershell-envfix处理Start-Process因 PATH 双键折叠而崩溃的坑。 - 停止逻辑的正确闸门是「内存标志未运行 且 真实进程都不在」才报未运行,否则按名称清理。
使用场景
- 要把带看门狗的 Python 服务打包成双击即用的单文件 GUI,并配置开机自启与关窗保活。
- 已有保活脚本会无脑杀掉同类进程,需要改成按真实进程检测,避免多管理器互杀隧道。
- 隧道令牌文件带 BOM 导致认证失败,需要统一用 utf-8-sig 读取并验证文件头字节。
- 管理器用内存布尔判断状态,停止按钮失效,需要改成基于真实进程检测的停止闸门。
适合人员
- 需要把 Python 服务连同看门狗打包成 Windows 单文件 GUI 并保持长开不中断的开发者
- 负责 SCADA 监控管理器维护,需要处理开机自启、单实例和关窗保活的 Windows 运维工程师
- 在 Windows 上做本地守护工具,担心多实例互杀和进程状态脱节的桌面应用作者
- 需要修复令牌 BOM 认证失败和停止按钮失效问题的 IT 支持或现场调试人员