python打包pyqt_PyInstaller打包PyQT5的若干坑....

本文详细介绍了在Win10环境下,使用Python3.6.2、Pyinstaller3.4和PyQT5.9.2进行应用程序打包过程中遇到的版本兼容、动态库错误、loadUi闪退等问题,以及解决方案。包括安装更新KB2999226解决动态库错误,正确处理loadUi加载ui文件的方式,避免命令窗口出现,以及使用--debug参数进行问题排查。同时,文章指出打包后exe文件存在的小图标显示、文件大小过大和环境适应性问题。
摘要由CSDN通过智能技术生成

网络上相关教程不少,都不很顺利。自己也尝试好几个打包工具,遇到了大大小小的问题。

变换工具对于解决问题无益,反复尝试Pyinstaller,逐个排查,是最快的方法。

我的环境Win10+Python3.6.2+Pyinstaller3.4+PyQT5.9.2

版本兼容问题

网上不少教程说,Pyinstaller不支持PyQT5.11及更新的版本,推荐Pyinstaller3.2.1+PyQT5.8的组合。

在我的环境下尝试Pyinstaller3.4+PyQT5.12,能成功打包,但会出现如下错误:

经过验证,Pyinstaller3.4+PyQT5.9.2,运行正常。

动态库错误 WARNING: lib not found:api-ms-win-crt-utility-l1-1-0.dll dependency of D:\TEMP\python36\lib\site-

packages\PyQt5\Qt\plugins\platforms\qwindows.dll

等一大串错误

网上不少教程说,需要在pyinstaller时指定 paths D:\TEMP\python36\lib\site- packages\PyQt5\Qt\plugins\bin,以及plugins等等,并非如此。

其实这里主要是api-ms-win-crt-runtime动态库之类的错误,是因为Universal CRT(KB2999226)缺失,可以通过安装此更新来解决问题,或者直接下载 Visual C++ Redistributable。

最简单的解决办法:网络上找到 vc2015dll包,将dll文件放入对应的文件夹(C/windows/system32下)即可,如果使用64位系统,下载的时候需要区分。

loadUi( '\main.ui', self)引起的闪退

打包后的文件

如果在main.py中使用了loadUI方法来加载ui文件,那么打包时需要Pyinstaller --add-data="main.ui;." main.py

不然运行exe的效果就是闪退。调用ui文件有两种方法:

1)使用PyUIC将.ui文件转换为.py文件,然后from import方法调用。这种方式每次修改UI都要转换一下,比较麻烦

2)直接导入from PyQt5.uic import loadUi,然后在初始函数def __init__(self): 下面使用loadUi('\main.ui', self)调用ui文件

def __init__(self):

super(self).__init__()

if getattr(sys, 'frozen', False):

# we are running in a bundle

bundle_dir = sys._MEIPASS

else:

# we are running in a normal Python environment

bundle_dir = os.path.dirname(os.path.abspath(__file__))

loadUi(bundle_dir + '\main_UI.ui', self)PyQt5学习笔记4_loadUi加载ui文件 - yy123xiang的专栏 - CSDN博客​blog.csdn.net

Fail to execute script xx

偶有遇到。从GitHub里的issue看,这里主要往往都是路径问题,仔细检查各文件路径,脚本里的路径,检查环境变量。

排查路径的小经验是:不选择单文件打包,而是动态打包,打包完成的文件夹中,查看调用的各资源文件是否成功被打包。

检查打包生成的spec文件,查看打包设置的文件路径是否正确。

当然也有一种很意外的情况。Qtdesigner生成的.ui文件,会因为某种错误,运行okay,但打包运行会出现fail to execute的错误。崩溃的我,内心在嘶吼“什么都没改啊,就微调了一下界面而已”。最后通过pycharm历史文件功能,恢复了一下.ui文件就正常了。

运行去命令窗

默认情况下,打包的exe运行会有命令窗,GUI程序不需要,打包时--noconsole即可,-w也是一样。

pyinstaller -F --add-data="main.ui;." main.py --noconsole

其他pyinstaller --debug ALL main.py

pyinstaller -i name.ico main.py

很多教程都比较简洁,直接-d 或者 --debug,在现在的Pyinstaller中,--debug后面需要带参数比如 ALL,可以帮助你查看具体错误,方便troubleshooting。

而-i则可以将同路径下的图标打包进去。

仍然存在的问题

1. 目前发现exe文件在最小图标显示情况下,不能显示打包进去的图标。

2. Pyinstaller打包后的文件太大了,很小的一个程序仍然18mb。使用upx打包后,文件大小降为14mb,但运行会有dll文件相关报错。

3. 打包文件只能适应原环境(win10/64位),想要迁移到其他环境中运行,需要在对应环境下分别打包。

写程序两小时,打包两天,反复卸载重装,被无情嘲讽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值