手把手教你将pyqt程序打包成exe(2)
手把手教你pyqt打包成exe如果是打包萌新,建议您先看:上一篇提到打包的环境和打包示例一(没有外部资源依赖的打包):手把手教你pyqt打包成exe(1)这篇将讲解示例二(带有多个外部资源依赖程序的打包),同时进一步讲解.spec文件。0x00 示例二项目文件结构需要打包的项目复制出一份,然后适当调整项目结构。为什么我一直强调项目结构?我个人觉得,项目结构调整好,才不容易出现...
手把手教你pyqt程序打包成exe
如果是打包萌新,建议您先看:
上一篇提到打包的环境和打包示例一(没有外部资源依赖的打包):
手把手教你pyqt打包成exe(1)
这篇将讲解示例二(带有多个外部资源依赖程序的打包),同时进一步讲解.spec文件。
0x00 示例二
项目文件结构
需要打包的项目复制出一份,然后适当调整项目文件结构。
为什么我一直强调项目文件结构?
我个人觉得,项目文件结构调整好,才不容易出现因为在某个py文件引用了其他py的内容,由于自己import操作不当而出现打包后找不到某个引用的模块等问题。。
再说,如果只是自己
为了打包一个比较实用的exe(可以发exe文件别人,然后在其他电脑上正常运行),那么我完全可以将项目文件结构调整的更利于打包的形式。比如:将多个py文件合并到一个py文件,这样就可以避免因为自己import不当而出现的打包后运行出错的问题。
ps:用pyinstaller打包exe,我研究了将近两天时间,不断找资料,不断尝试。最后作个总结,也希望能够帮到某些人。如果有不太对的地方,希望大家积极指出~
资源文件说明
示例二项目文件:
引用了多个外部资源文件,如图中红色矩形所示。
MainDemo.py集成了其他的py里的类。
我们的目标是把外部资源文件一起打包”进“exe文件,并且要正常运行。
本来这些外部资源文件不是在src下的,我是为了避免各种出错才把它放在了src文件夹下。
这次我们先来单个文件夹打包~
预处理
我们引用的文件资源,路径全部用的是我们本机上的(相对)路径。如果移动到其他计算机上,那么很可能因为依赖的外部资源文件路径不同而无法运行。
直接上解决措施吧。
需要新建一个py文件来”冻结”资源文件路径:
frozen_dir.py
import sys
import os
def app_path():
"""Returns the base application path."""
if hasattr(sys, 'frozen'):
# Handles PyInstaller
return os.path.dirname(sys.executable)
return os.path.dirname(__file__)
if __name__=='__main__':
print(app_path())
这个py文件是为了获得’冻结了’的基路径
其他文件路径,可由基路径+字符串 拼接获得。
要注意这个py文件放的位置,要在src下。
要引用外部资源文件的地方,那个py文件要import frozen_dir
,
资源路径 = app_path() + xxx/xx
比如要引用imgs里面的图片,
base = frozen_dir.app_path()
图片路径 = '{}\imgs\分析.png'.format(base)
引用其他资源文件同理,因为冻结路径的py文件和它们一样都在src下。
这样不管,在哪台计算机中运行,都会相对’冻结路径‘的基路径来精确获得资源路径。
基于冻结的基路径将引用的外部资源文件的路径设置好后,我们开始来打包。
单文件夹打包
pyinstaller -D -w -i .\halo.ico .\MainDemo.py
此时去dist中的文件夹下找到exe双击运行:
cmd运行:
发现并没有提示错误。
为什么?
因为我能程序里引用的外部资源并没有打包进去!
我们来修改.spec:
add_files是一个列表,列表里元素是元组,
元组第一项是要引用的外部资源的路径(可以是文件/文件夹),第二项是打包进exe,在exe中的路径(所在文件夹)
然后输入:
pyinstaller .\MainDemo.spec
重新构建exe
再去dist里面找exe并运行:
完美~
PS:
细心的崽崽一定会发现,其实只是把外部资源文件拷贝了一份在exe所在的文件夹下,并不是压缩到exe里面去~
(图片资源可以压缩进exe,通过
编写qrc文件转换为py文件,导入py文件,修改引用----》
手把手教你pyqt中.qrc图片文件的编写和使用)
所以,刚才也可以不修改.spec文件,可以直接把外部资源文件拷贝进exe所在文件夹,这样也可以运行exe。
再次Tip:只要dist文件夹里的有用,发给别人的时候只需要发这里面的东西即可(本来pyqt打包的exe就比较庞大,更没必要发一下没用的文件给别人)
下面来演示单文件打包。
单文件打包
pyinstaller -F -w -i .\halo.ico .\MainDemo.py
一开始我以为exe图标没有成功加上去。
害的我还不断尝试,尝试的要崩溃的感觉。挺扎心的,不过还好没放弃~
pyqt打包exe的icon“没有显示”的原因:
这里icon没显示的原因:
其实是因为icon不够大,而图标又放的太大显示不出来。
真的显示不了的原因可能是图标不符合icon标准
只需要按住ctrl+鼠标滚轮缩小即可看的icon…
此时双击能运行吗?
我为啥要先做单文件夹的演示?哈哈~
解决方案和上面一样。
简单的肯定不是改.spec文件在重构。
而是把依赖的资源文件/文件夹拷贝到exe所在目录下。
也正好验证一下上面提到的!
示例演示就暂时到这里了,希望能带给你点启发,给你点帮助~
如果有帮助或者启发,关注我,或者给我点个赞,留个言,就是对我最大的鼓励了!! ------》现在是2020/04/26/ 0:30
.spec文件
篇幅原因 + 太晚了!!
这里也简单介绍一点.spec里面的配置吧。
研究深入点+有时间 再单独写一篇吧。
总结
pyqt程序打包成exe需要自己多折腾~
还要想办法压缩打包exe的体积。
有时间也可以多去了解一下pyqt生成的exe的编译和反编译…
说明
如果有帮助或者启发,关注我,或者给我点个赞,留个言,就是对我最大的鼓励了!!** ------》现在是2020/04/26/ 0:59
参考:文献1
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)