如果是打包萌新,建议您先看:
上一篇提到打包的环境和打包示例一(没有外部资源依赖的打包):
手把手教你pyqt打包成exe(1)
为什么我一直强调项目文件结构?
我个人觉得,项目文件结构调整好,才不容易出现因为在某个py文件引用了其他py的内容,由于自己import操作不当而出现打包后找不到某个引用的模块等问题。。
再说,如果只是自己
为了打包一个比较实用的exe(可以发exe文件别人,然后在其他电脑上正常运行),那么我完全可以将项目文件结构调整的更利于打包的形式。比如:将多个py文件合并到一个py文件,这样就可以避免因为自己import不当而出现的打包后运行出错的问题。
ps:用pyinstaller打包exe,我研究了将近两天时间,不断找资料,不断尝试。最后作个总结,也希望能够帮到某些人。如果有不太对的地方,希望大家积极指出~
示例二项目文件:
引用了多个外部资源文件,如图中红色矩形所示。
我们的目标是把外部资源文件一起打包”进“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下。
import frozen_dir
,base = frozen_dir.app_path()
图片路径 = '{}\imgs\分析.png'.format(base)
引用其他资源文件同理,因为冻结路径的py文件和它们一样都在src下。
这样不管,在哪台计算机中运行,都会相对’冻结路径'的基路径来精确获得资源路径。
基于冻结的基路径将引用的外部资源文件的路径设置好后,我们开始来打包。
pyinstaller -D -w -i .\halo.ico .\MainDemo.py
然后输入:
pyinstaller .\MainDemo.spec
重新构建exe
完美~
PS:
细心的崽崽一定会发现,其实只是把外部资源文件拷贝了一份在exe所在的文件夹下,并不是压缩到exe里面去~
(图片资源可以压缩进exe,通过
编写qrc文件转换为py文件,导入py文件,修改引用----》 手把手教你pyqt中.qrc图片文件的编写和使用)
再次Tip:只要dist文件夹里的有用,发给别人的时候只需要发这里面的东西即可(本来pyqt打包的exe就比较庞大,更没必要发一下没用的文件给别人)
下面来演示单文件打包。
pyinstaller -F -w -i .\halo.ico .\MainDemo.py
一开始我以为exe图标没有成功加上去。
害的我还不断尝试,尝试的要崩溃的感觉。挺扎心的,不过还好没放弃~
这里icon没显示的原因:
其实是因为icon不够大,而图标又放的太大显示不出来。
真的显示不了的原因可能是图标不符合icon标准
只需要按住ctrl+鼠标滚轮缩小即可看的icon…
篇幅原因 + 太晚了!!
这里也简单介绍一点.spec里面的配置吧。
研究深入点+有时间 再单独写一篇吧。
pyqt程序打包成exe需要自己多折腾~
还要想办法压缩打包exe的体积。
有时间也可以多去了解一下pyqt生成的exe的编译和反编译…
如果有帮助或者启发,关注我,或者给我点个赞,留个言,就是对我最大的鼓励了!!** ------》现在是2020/04/26/ 0:59
参考:文献1
联系客服