From e9ff0d3287c94240f1be54402aa67868a3d03201 Mon Sep 17 00:00:00 2001 From: ylytdeng Date: Sun, 17 May 2026 17:15:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(app=5Fgui):=20=5Frun=5Fsubprocess=20?= =?UTF-8?q?=E6=BC=8F=20=5F=5Ffile=5F=5F=20=E5=AF=BC=E8=87=B4=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=A8=A1=E5=BC=8F=20GUI=20=E6=89=80=E6=9C=89=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题 GUI 点任何子任务按钮 (⑤ 企微解密 / ③ 导出 / 等), 日志报: unknown option --task usage: ... python.exe [option] ... [-c cmd | -m mod | file | -] [arg]... 返回码 2, 任务失败。 ## 根因 `_run_subprocess` 构造的命令是: cmd = [sys.executable, "--task", task] 打包成 exe (sys.frozen=True) 时 sys.executable 就是 WeChatDecrypt.exe 本身, `--task` 是它的 argparse 子命令, 命令变成 `WeChatDecrypt.exe --task find_wxwork_keys` —— OK。 开发模式 (`python app_gui.py`) 时 sys.executable 是 python.exe, 命令变成 `python.exe --task find_wxwork_keys`, 但 `--task` 不是 python 解释器的选项, 直接报 unknown option。 ## 修复 判断是否打包: if getattr(sys, "frozen", False): cmd = [sys.executable, "--task", task] else: cmd = [sys.executable, os.path.abspath(__file__), "--task", task] 加注释说明两种模式下命令行长什么样。 ## 影响 - 开发模式 GUI 之前完全废, 任何按钮点了都报错。修复后恢复正常。 - 打包成 exe 路径未受影响 (该分支保持原行为)。 ## 实测 本地 (Windows) 跑 `python app_gui.py`, 点 ⑤ 企业微信解密 现在能正常调 find_wxwork_keys 并解出 17 个 db。 发现路径: code review (4 个 reviewer 之一) 提到 GUI subprocess 调用方式 但没指出具体 bug, 用户实测点按钮时通过日志 `unknown option --task` 暴露。 --- app_gui.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app_gui.py b/app_gui.py index 090fad3..0bdc39a 100644 --- a/app_gui.py +++ b/app_gui.py @@ -773,8 +773,18 @@ class App(tk.Tk): # ── 子进程执行 ───────────────────────────────────────────────────────── def _run_subprocess(self, task: str) -> int: - """运行子进程,返回退出码""" - cmd = [sys.executable, "--task", task] + """运行子进程,返回退出码 + + 打包成 exe (`sys.frozen=True`) 时 sys.executable 就是 exe 本身, + `--task` 是它的子命令,直接走 [exe, --task, ...] 即可。 + 开发模式 (python app_gui.py) 时 sys.executable 是 python 解释器, + 需要把当前脚本路径 __file__ 加上,否则 `python --task` 会被解释器 + 误判为 `python --task` (报 unknown option)。 + """ + if getattr(sys, "frozen", False): + cmd = [sys.executable, "--task", task] + else: + cmd = [sys.executable, os.path.abspath(__file__), "--task", task] self.after(0, self._log, f">>> {' '.join(cmd)}\n\n") env = os.environ.copy()