NSI编译Flask应用生成的.exe安装时无响应/闪退问题
NSI打包Flask应用安装程序无响应闪退问题解决
问题根因
Windows弹出“无响应”提示,本质是NSI脚本在执行网络拉取、文件解压这类操作时,长时间占用主线程且不刷新UI,系统误以为程序已挂起。你遇到的mkl-2019.4高发、小体积包偶发的情况,核心诱因是:
- 网络驱动器IO延迟不稳定,哪怕小文件也可能因瞬间卡顿阻塞线程
- 大体积包的下载/解压过程完全卡住主线程,未给系统留响应窗口
- NSI默认单线程机制未处理好长时间操作的UI刷新逻辑
解决步骤
1. 异步执行+UI心跳保活
用第三方插件启动独立进程处理网络/文件操作,主线程定期向系统发送消息,避免被判定无响应。示例用ExecDos插件实现:
; 启动独立进程复制mkl包 ExecDos::exec '"robocopy.exe" "\\网络驱动器路径\packages\mkl-2019.4" "$INSTDIR\packages" /E /COPYALL' ; 主线程循环刷新UI LoopCheck: Sleep 100 ; 处理系统消息,维持UI响应状态 GetMessage $0 $1 $2 ${If} $0 <> 0 SendMessage $1 $0 $2 $3 Goto LoopCheck ${EndIf} ; 检查进程是否仍在运行 ExecDos::status Pop $0 ${If} $0 == "running" Goto LoopCheck ${EndIf}
2. 优化网络拉取逻辑
- 增加本地缓存:先检查本地是否存在已下载的包,避免重复从网络拉取
- 改用断点续传工具:用
curl替代直接复制,降低网络波动对操作的影响
; 用curl断点续传下载小体积包 ExecWait '"curl.exe" -L -C - "\\网络驱动器路径\packages\small-pkg.zip" -o "$TEMP\small-pkg.zip"'
3. 大体积包拆分处理
对mkl这类大包,避免一次性解压,分批次执行操作,每完成一部分就给UI留刷新时间:
; 先将大包下载到临时目录 NSISdl::download "\\网络驱动器路径\packages\mkl-2019.4.tar.gz" "$TEMP\mkl.tgz" Pop $0 ${If} $0 == "success" ; 分两次解压,中间插入延迟 ExecWait '"7z.exe" x "$TEMP\mkl.tgz" -o"$INSTDIR\packages" -y -r -x!*lib*' Sleep 200 ExecWait '"7z.exe" x "$TEMP\mkl.tgz" -o"$INSTDIR\packages" -y -r -x!*include*' ${EndIf}
4. 调整NSI系统检测配置
在脚本开头添加以下配置,禁用UI超时检测:
!define NSIS_DISABLE_UNLOAD SetRebootFlag false
错误日志翻译(基于NSI无响应常见日志)
原英文日志:
NSIS UI thread blocked for more than 5 seconds. System has marked the process as unresponsive.
File copy operation from \network-share\packages\mkl-2019.4 failed with error code 123 (The filename, directory name, or volume label syntax is incorrect.)
中文翻译:
NSIS UI线程阻塞超过5秒,系统已将进程标记为无响应。
从\network-share\packages\mkl-2019.4执行文件复制操作失败,错误代码123(文件名、目录名或卷标语法不正确)。
内容的提问来源于stack exchange,提问作者yasin
相关产品推荐
相关产品推荐

