手把手教你将pyqt程序打包成exe(2)

手把手教你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

猜你喜欢

转载自blog.csdn.net/tb_youth/article/details/105758308