Pyinstaller 打包exe 报错 "failed to execute script XXX"的一种解决方案
最近用pyqt5写了一个界面小程序,需要打包成exe给到其他windows上使用,一开始使用python 3.7 64位,用pyinstaller打包exe,在64位机上运行正常。 但是目标电脑是32位的,所以需要打包32位exe,然后问题就出现了。
打包32位exe, 虽然网上有教程说使用 anaconda 生成python 的32位环境,我试了,但是没有成功,转而选择卸载64位python,不如直接装32位的python, 依旧使用pyinstaller 打包
打包时虽然有几个警告但貌似还顺利,点开exe后报 "failed to execute script xxx",更换了多个python 版本,装了卸卸了装,翻了很多资料都没有解决,于是打算自力更生
众所周知,可以用这条命令打包不带控制台的exe:
pyinstaller -w -f xxx.py
但这样就没办法看到报错了,因此保留控制台:
pyinstaller -f xxx.py
打包后,程序一闪而过,用手机开视频录下来(60fps), 画质很渣但是依然无法看漏“unable to find qtcore.dll on path”:
问题应该就是丢失pyqt库了,少了就补上吧~ 直接将这个dll拷贝到 c:\windows\system32下,然后开开心心的点开exe,问题就解决了~.....才没有解决......
需要把python的pyqt5库路径添加到环境变量path中才行,这回就真的能跑起来了,很开心(实际上到这一步折腾了很久),不过估计要在目标电脑装好pyqt5,然后添加环境变量,虽然有点麻烦但是能用。
事情就这么告一段落了....
才没有告一段落,我并不甘心,凭什么64位跑得好好的,32位就丢dll,凭什么命令行运行正常,exe就丢东西?而且我到exe的临时目录看了,实际上qt5core.dll等库都好好的躺在里面的,但是为什么就有说找不到,然后尝试了
1. 把qt5core.dll强行再打包在exe中,这个可以编辑spec文件实现,改datas那行,不行!
2. 尝试在运行时调整运行路径,或者添加临时路径,让程序可以识别原本就在同一层目录下的dll们,没有找到类似的教程(这样的需求本来就很奇怪吧?)
3. 换了另一台试了下,建了个虚拟机试了下,以排除系统区别,不行
4. 换了低版本的python 试了下,不行
5. 尝试更换打包软件,好像大多都是pyinstaller,还有py_win32,cx_freeze等,py_win32貌似需要重新写界面,cx_freeze按例程跑了下一点效果都没有。
费了很长时间,可以说很心累了,有幸看到了一篇博文:
标题可以看出很接近了,其实降低了pyqt5的版本就可以了,似乎不需要像这篇博文里面降低pyinstaller的版本(3.5),打包后不用添加环境变量也可以正常运行了,exe体积还降低了一半...
一开始我用的pyqt5.13.0打包32位报错,降低到5.9.2就没问题了,顺便记一下pip安装指定版本的库:
pip install pyqt5==5.9.2
我喜欢把各种依赖的库写在一个cmd文件中,需要安装环境时双击一下就完事了
总结一下就是:
pyinstaller打包pyqt5程序时,若提示丢失dll文件,可尝试降低pyqt5的版本,如pyinstaller3.5 + pyqt5.9.2组合 (@windows 7 x64 sp1 + python 3.7.4 x32)
上一篇: matplotlib使用笔记
下一篇: String字符串创建与存储机制