PyInstaller打包的exe启动慢的核心原因是Python解释器初始化和冻结环境加载耗时,尤其导入大量模块时需从.exe解压构建sys.path;Windows上还受杀软扫描、UAC、I/O等影响。

为什么 PyInstaller 打包的 exe 启动慢?
核心原因是 Python 解释器初始化 + 冻结环境加载耗时,尤其在导入大量标准库或第三方模块(如 matplotlib、pandas、requests)时,PyInstaller 需从单个 .exe 中解压并构建临时 sys.path,这个过程无法跳过。Windows 上还叠加了杀毒软件扫描、UAC 提权延迟、磁盘 I/O 慢等外部因素。
- 启动慢 ≠ 运行慢,后续执行速度基本不受影响
- 32 位打包在 64 位系统上会额外触发 WoW64 层转换,明显拖慢启动
-
--onefile模式比--onedir启动更慢(每次都要解压资源)
用 --onedir 替代 --onefile 是最有效的提速手段
--onedir 生成一个文件夹,把所有依赖解压到磁盘固定位置,下次启动直接读取,跳过重复解压。实测多数 GUI 程序启动时间可从 5–10 秒降至 1–2 秒。
- 必须配合
--noconsole(GUI 程序)或保留控制台(CLI 程序),否则窗口闪退风险上升 - 发布时需分发整个文件夹,不能只传一个 exe
- 可手动删除
build/和pycache/目录节省体积,不影响启动速度 - 如果必须用
--onefile,加--upx-exclude=vcruntime140.dll避免 UPX 压缩干扰加载(某些 DLL 被压缩后加载异常变慢)
精简 import 和延迟加载关键模块
很多程序在模块顶层就 import torch、sklearn 等重型库,哪怕实际只在某个按钮点击后才用。这些 import 会在启动时强制触发全部初始化逻辑。
- 把非必需的 import 移到函数内部,例如:
def on_click(): import pandas as pd # ← 放这里,不用时完全不加载 df = pd.read_csv(...)
- 使用
importlib.import_module()动态加载,便于按需控制时机 - 检查
init.py是否隐式触发了冗余 import 链 - 替换掉
from xxx import *,显式列出所需符号,减少未使用模块的加载
绕过 Windows 杀软和 SmartScreen 的启动阻塞
部分企业环境或新 Win10/11 机器会对首次运行的未签名 exe 进行全量扫描,导致卡在“正在检查此应用”界面数秒甚至十几秒。
立即学习“Python免费学习笔记(深入)”;
- 用
signtool对 exe 签名(需购买代码签名证书),可彻底消除 SmartScreen 警告和杀软深度扫描 - 若无签名条件,打包后右键 → “属性” → 勾选“解除锁定”,再分发给用户(仅对当前文件有效)
- 在打包命令中加
--add-binary注入空资源节(如图标),有时能降低杀软可疑度 - 避免在程序名或路径中出现
hack、crack、keygen等敏感词,会被某些引擎主动拦截
启动慢问题往往不是单一原因,而是解释器冷启、磁盘解压、模块加载、系统策略四层叠加。最容易见效的是切 --onedir + 移除顶层重模块 import;最难但最彻底的,是签名 + 优化用户首次运行路径。










