fix(app_gui): _run_subprocess 漏 __file__ 导致开发模式 GUI 所有按钮失效

## 问题

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` 暴露。
This commit is contained in:
ylytdeng
2026-05-17 17:15:24 +08:00
parent 7954d49240
commit e9ff0d3287

View File

@@ -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()