[Bug] 非管理员启动时提权重启失败:crash_dump 用了 CWD 相对路径,子进程静默退出
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 1/5
- Tempo stimato
- Meno di un'ora
- Idoneità per principianti
- 85/100
Direzione di ricerca
Il traceback punta a new_gui.py riga 1930 nel blocco __main__, dove crash_dump.txt viene aperto con un percorso relativo alla CWD mentre PATHS["logs"] contiene già un percorso assoluto derivato da __file__; il figlio elevato eredita la directory di lavoro di cmd.exe dalla chiamata a ShellExecuteW vicino alla riga 1873. Inizia leggendo quei due punti, poi riproduci con un uv run new_gui.py non amministratore. Fatto significa che il dump viene scritto sotto PATHS["logs"] indipendentemente dalla CWD e la finestra GUI appare dopo il prompt UAC; passare PATHS["root"] come directory di lavoro nella chiamata a ShellExecuteW è la seconda metà opzionale.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
问题描述
非管理员权限启动 uv run new_gui.py 时,程序打印完路径检测和「848 个记忆图像切片载入完成」后静默退出,GUI 窗口不出现。
原因是启动链上两处叠加:
- 入口用 CWD 相对路径写崩溃转储:
open("logs/crash_dump.txt", "w"); - 非管理员启动会走提权重启(
ShellExecuteW(..., "runas", ...)),提权后的子进程工作目录不含logs/。
子进程在 main() 之前就抛 FileNotFoundError 退出,所以看不到任何窗口或报错框。
复现步骤
-
在仓库根目录用非管理员终端执行
uv run new_gui.py; -
控制台输出(父进程):
路径存在, 检测通过: <仓库根>\logs 路径存在, 检测通过: <仓库根>\user\backup INFO - 发现 848 个记忆图像切片,正在载入缓冲区... INFO - 图像记忆切片载入完成: 848/848 成功 -
父进程提权重启后
sys.exit(0);提权子进程再次导入、打印同样的载入日志后立刻崩溃; -
程序整体退出,无窗口。
用管理员终端启动则一切正常(
is_admin()为真,不走提权分支)。
预期行为
弹出 UAC,提权后正常显示 GUI 主窗口。
截图或录屏
本次无截图/录屏(问题表现为控制台输出后无窗口,已在「复现步骤」中给出控制台文本)。
相关日志
logs/critical_log.log / logs/log_2026-11-15-21-59.txt 中的关键片段:
INFO [2026-11-15 21:59:17,299] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:28,329] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
INFO [2026-11-15 21:59:30,545] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:30,854] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
CRITICAL [2026-11-15 21:59:30,857] [log.py:271] 未捕获的严重异常发生!
Traceback (most recent call last):
File "new_gui.py", line 1930, in <module>
fault_log_file = open("logs/crash_dump.txt", "w", encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'logs/crash_dump.txt'
注意:logs/crash_dump.txt 是由父进程成功创建的(0 字节),崩溃的是提权后的子进程,说明父进程 CWD 正确、子进程 CWD 不对。
完整日志(文件上传)
未上传文件,直接粘贴当天运行日志 logs/log_2026-11-15-21-59.txt 全文:
INFO [2026-11-15 21:59:17,299] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:28,329] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
INFO [2026-11-15 21:59:30,545] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:30,854] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
CRITICAL [2026-11-15 21:59:30,857] [log.py:271] 未捕获的严重异常发生!
Traceback (most recent call last):
File "new_gui.py", line 1930, in <module>
fault_log_file = open("logs/crash_dump.txt", "w", encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'logs/crash_dump.txt'
INFO [2026-11-15 21:59:53,657] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:53,950] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
INFO [2026-11-15 21:59:56,176] [image_tool.py:83] 发现 848 个记忆图像切片,正在载入缓冲区...
INFO [2026-11-15 21:59:56,497] [image_tool.py:131] 图像记忆切片载入完成: 848/848 成功
CRITICAL [2026-11-15 21:59:56,500] [log.py:271] 未捕获的严重异常发生!
Traceback (most recent call last):
File "new_gui.py", line 1930, in <module>
fault_log_file = open("logs/crash_dump.txt", "w", encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'logs/crash_dump.txt'
操作系统
Windows 11 家庭版 中文版(10.0.26300,x64)
Python 版本
3.12.10(uv 0.13.6,项目 .venv)
项目版本 / Commit
master @ 488d822
附:根因定位(供参考,不需要照搬)
| 层 | 位置 | 说明 |
|---|---|---|
| 隐患 | new_gui.py:1930(__main__ 里) |
open("logs/crash_dump.txt", ...) 用 CWD 相对路径;而 PATHS["logs"] 本身是按 __file__ 算的绝对路径。全仓库没有 os.chdir,CWD 完全取决于启动方式 |
| 触发 | new_gui.py:1873 ShellExecuteW(None, "runas", host, arguments, None, show) |
03dea1411a「fix(gui): 提权改用签名宿主避免 UAC 弹框等十秒」(PR #417)把提权宿主从 sys.executable 换成了 cmd.exe。提权后的 cmd.exe 默认起在 C:\Windows\System32,子进程继承该 CWD,相对路径随之失效 |
建议修法(各一行):
# 1) 入口用绝对路径(治本,任何 CWD 都能跑)
fault_log_file = open(os.path.join(PATHS["logs"], "crash_dump.txt"), "w", encoding="utf-8")
# 2) 提权时显式传工作目录
result = ctypes.windll.shell32.ShellExecuteW(None, "runas", host, arguments, PATHS["root"], show)
改 1 即可解决本 issue;改 2 可以顺带避免其它依赖 CWD 的代码在提权后出问题。
- Lingua principale
- Python
- Stelle
- 568
- Fork
- 10
- Merge medio
- 10h 7m
- PR unite (30g)
- 108
Preparare l'ambiente
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di syfoud/Simulated_Scepter
-
Bug Fix / Bug 修复
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
syfoud/Simulated_Scepter#431 ·
I maintainer di solito rispondono entro 1 giorno
-
[Feature] 奇物选择添加优先级Apertagood first issue / 新手友好议题
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
syfoud/Simulated_Scepter#174 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
[Question] 交易区经常暂离重进循环该如何解决Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
syfoud/Simulated_Scepter#396 ·
I maintainer di solito rispondono entro 1 giorno
-
[Feature] 记忆GUI位置ApertaGood first issue / 新手友好议题
Difficoltà 3/5 1-2 giorni Idoneità per principianti 47/100
syfoud/Simulated_Scepter#303 ·
I maintainer di solito rispondono entro 1 giorno
-
[Feature] 关于增加debug识别框的建议Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
syfoud/Simulated_Scepter#302 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di syfoud/Simulated_Scepter
Issue simili
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
Sienna-Platform/SiennaSchemas#130 ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
firedrakeproject/Irksome#293 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
ida-arbeitszeit/workers-control#1578 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
aws-samples/sample-per-model-bedrock#898 ·
I maintainer di solito rispondono entro 1 giorno