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:
14
app_gui.py
14
app_gui.py
@@ -773,8 +773,18 @@ class App(tk.Tk):
|
|||||||
|
|
||||||
# ── 子进程执行 ─────────────────────────────────────────────────────────
|
# ── 子进程执行 ─────────────────────────────────────────────────────────
|
||||||
def _run_subprocess(self, task: str) -> int:
|
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")
|
self.after(0, self._log, f">>> {' '.join(cmd)}\n\n")
|
||||||
|
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
|
|||||||
Reference in New Issue
Block a user