Pyinstaller打包的应用启动后闪退,间隔30秒才重新打开如何解决?
解决方案
- 优先切换为onedir打包模式
onefile模式启动时需要将所有打包的依赖、资源全量解压到系统临时目录才能运行,你当前配置里手动引入了十余个第三方库的完整目录,还包含了videos、images等大容量资源,解压本身就会消耗大量时间。同时macOS的Gatekeeper安全机制会对临时目录的可执行文件做全量扫描,进一步拉长启动耗时,还可能触发拦截导致首次启动闪退。把打包命令里的--onefile参数去掉,改用onedir模式,启动不需要额外解压,速度会提升80%以上。 - 移除手动添加的第三方库全目录引入
你当前spec里手动加了10余行a.datas += Tree引入整个第三方库目录,会把库中大量无关的测试用例、文档、缓存文件全部打包进程序,让包体积暴涨数倍。把这些手动添加的第三方库Tree配置全部删除,只保留你自己的业务资源Tree('./images', prefix='images')、Tree('./videos', prefix='videos')、Tree('./days', prefix='days')即可。如果运行时提示缺模块,再单独补充hiddenimports配置,不要整包导入第三方库。 - 先开启控制台排查闪退原因
把EXE配置里的console=False改成console=True,打包后在终端执行./Adventskalender.app/Contents/MacOS/Adventskalender运行,就能看到首次启动闪退的具体报错。大概率是你代码里写的资源路径是相对路径,onefile模式下运行时的工作目录和开发时不一致,找不到资源才触发崩溃,等30秒后临时目录缓存生成后才正常启动,调整资源路径为动态获取运行时目录即可解决。 - 调整UPX压缩配置
当前配置里upx=True会对所有二进制文件做压缩,大体积的二进制文件(比如moviepy依赖的ffmpeg、Python框架文件)解压会消耗大量时间,同时macOS下UPX压缩后的文件会被Gatekeeper额外扫描,拉长启动时间。可以直接关闭UPX,或者把大体积的二进制文件添加到upx_exclude列表跳过压缩。 - 如必须使用onefile模式,指定固定缓存目录
要是有要求必须用单文件包,给EXE配置里的runtime_tmpdir指定固定的缓存路径,比如~/Library/Caches/Adventskalender,这样只有首次启动需要解压,后续启动会复用缓存文件,不需要重复解压,启动速度会大幅提升。
内容的提问来源于stack exchange,提问作者friedaxvictoria
相关产品推荐
相关产品推荐

