fix(desktop): 修复 console=False 下 exe 打不开

PyInstaller windowed 启动器 (runw.exe, console=False) 不分配控制台,
sys.stdout/stderr 为 None。desktop.py / main.py 的 logging.basicConfig
默认建 StreamHandler(sys.stderr), stderr 为 None 时首次写日志调用
None.write() 抛 AttributeError, 崩在导入早期, 进程被 OS 直接终止,
try/except 都拦不住 → 用户看到「双击一闪退出、查无日志」。

修复:
1. _guard_streams() - 启动最早期把缺失的 stdout/stderr 换成丢弃写入的
   _NullStream, 让 logging/reconfigure/print 全部安全落地 (windowed 标准修法)
2. _setup_logging() - 追加 FileHandler 到 data/desktop.log, console=False
   下不再吞日志, 事后可查
3. _run_uvmicorn() - except Exception 捕获后端导入/运行崩溃并写 traceback,
   不再静默死亡 (主线程只报「超时」却查无原因)
4. main() - except Exception 顶层兜底: 崩溃时 logger.exception + 弹原生
   MessageBox 显示完整堆栈, 让用户能截图反馈

验证: console=False 包本地能正常打开 (修复前打不开)
This commit is contained in:
shy3130
2026-07-03 22:02:13 +08:00
parent 17188e16db
commit 6a74fa9963
2 changed files with 111 additions and 3 deletions
+1 -1
View File
@@ -164,7 +164,7 @@ exe = EXE(
bootloader_ignore_signals=False,
strip=False,
upx=False, # UPX 压缩原生库常导致崩溃, 关闭
console=False, # 桌面应用: 不显示控制台窗口 (调试时临时改 True 抓日志)
console=False, # 桌面应用: 不显示控制台窗口 (_guard_streams 守护 stdout/stderr)
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,