从打包到跑路----记PYQT的打包之路

写在前面

和写C++比起来,写python是一件很爽的事情,为了一直写python一直爽,就算在写带界面的桌面应用时,我们也可以选择PYQT(虽然文档比起QT来乱了不少,但为了一直爽,这点小折磨还是可以忍受的,遇到问题搜一搜总是能解决的)。

但俗话说出来混总是要还的,当代码写完,有需求需要打包发布的时候,问题来了:该怎么打包呢?

上路准备

在经过一番搜索调研之后,我们可以发现,py一般主流用以下两个工具模块进行打包:

1、py2exe https://pypi.org/project/py2exe/
2、pyinstaller http://www.pyinstaller.org/

那么下面就是选择题了,由于我打包项目的时候py2exe还不支持python3.4以上的版本,而我当时恰恰用的是python3.5,为了打包而将项目再整体迁移到另一个版本这种事情,不到万不得已我们是做不出来的,所以对当时的我来说只有一条路,pyinstaller。(现在py2exe貌似已经全面支持了python3,如果有兴趣的童鞋可以尝试)

py2exe和pyinstaller这两个工具的基本用法和文档说明在官网中都有介绍,我们在愉快的安装完工具模块后,本以为几行命令就可以搞定收工,不料这才是漫漫旅途的第一步。。。

第一难:打包PYQT的依赖模块

我们按葫芦画瓢,假设这里的打包的目标文件为main.py

pyinstaller main.py

我们按下回车执行命令,会惊喜的发现执行过程中会出现一堆warnning,虽然最终也可以生成exe,当双击打开后会提示缺少依赖的xxxdll文件,然后喜闻乐见的失败。
也许是姿势不对?不甘心失败的我们也许会尝试按例子,换一个简单的py程序(比如没有界面的helloworld)来进行打包,结果时so easy的一次成功,那么很显然了,pyqt有什么特殊的地方。
于是再经过一番紧张的搜索,我们找到了答案,pyqt执行所依赖的DLL文件没有被打包进去,那么加进去再来:

pyinstaller  --path “D:\Program Files\py3.5\Lib\site-packages\PyQt5\Qt\bin”  main.py

这里D:\Program Files\py3.5\Lib\site-packages\PyQt5\Qt是我本机PYQT的安装路径(相关的DLL在bin文件夹下),大家可以根据自己的实际情况进行调整,再次回车执行,谢天谢地,总算能够看到界面了。

第二难:打包资源文件

当我们以为可以收工的时候,会发现界面有些地方不对劲,貌似图片都没有显示,再进一步发现,如果有依赖一些静态文件,那么相关的功能也都gg了,很明显,我们依赖的资源文件没有被打包进去。

已经被使用很久的工具显然不会连这点功能都不具备,这里有两个解决办法:
1、将需要使用的资源文件拷贝到打包好的exe文件目录下,注意代码中使用这些资源的时候的路径;
2、修改pyinstaller的spec文件,将需要打包的配置文件填进去,比如:

a = Analysis(...
     datas=[ ('src/README.txt', '.') ],
     ...
     )

实际使用时可以任选以上一种方法,重新再打包,图片就可以显示了。

第三难:显示多种格式的图片

当跨过上一个坎之后,我们发现普通格式的图片都能够成功显示了,但似乎有个别图片还是不行,比如GIF格式的图片。原因是在QT中,播放GIF所需插件的DLL没有加载,之前我们加载的PYQT所依赖的DLL在bin文件夹下,这里需要的在plugins文件夹下,于是再把这个文件夹给加上:

pyinstaller  --path “D:\Program Files\py3.5\Lib\site-packages\PyQt5\Qt\bin--path "D:\Program Files\python3\Lib\site-packages\PyQt5\Qt\plugins"   main.py

如果这样还是不能显示,我们还有绝招:
1、在打包的exe文件所在目录下,建立imageformats文件夹,然后将显示图片所依赖的DLL手工拷贝进来;
在这里插入图片描述
2、在启动pyqt的app时,添加如下代码:

    app = QtWidgets.QApplication(sys.argv)
    app.addLibraryPath('./plugins')

这样再折腾一番,就算是GIF格式的图片,也应该能看到了。

第四难:系统环境要求

然而在本机上折腾完了,当你兴冲冲的把打包完成的exe文件交给别人,结果有些机器上一样运行不起来。。。这个问题和具体的操作系统有关,就已知的情形有:
1、系统缺少VC运行库,可以从网上下载后安装搞定;
2、当使用webEngine时,有些比较老的工控机可能显卡的opengl版本不够,导致无法运行,更换显卡可以搞定。
除了以上两种情形之外,可能还会遇到一些其它问题,只能烧香拜佛了。。。

跑路

经历了以上种种磨难之后,我们可以得出这样的结论:pyqt可以用,但如果最终需要打包的话,我们就需要好好考虑一下了,这时候也许回归QT才是正路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值