pyinstaller制作exe

简介

所谓的exe制作也就是把你写python程序freeze起来,这样目标机器上用户没有安装python或者等等其他依赖都能正常运行程序。

推荐使用pyinstaller。 pyinstaller的官网在 这里 。安装就是用pip安装即可。

然后推荐在你的项目根目录下创建一个简单的启动脚本,一方面方便平时测试,一方面作为pyinstaller的程序入口。

NOTICE: 注意该脚本的名字不要和你的程序的模块名字相同,之前我安装后闪退就是因为这个脚本名字没取好。

具体使用很简单:

pyinstaller you_entry_point.py

当然该脚本文件不一定在当前目录下,你也可以如下来指定目标脚本文件:

pyinstaller yaogua\gui.py

如果一切顺利,到 dist 文件夹下运行你的目标程序exe运行正常,一切都OK,那么恭喜你了。没必要继续往下看了。如果出问题了,那么请钻研官方文档吧,下面也会做出一些补充说明。

首先你不能依靠自动生成的 .spec 文件了,接下来讨论了很多定制都是基于对这个 .spec 文件的修改。修改好了之后你后面要运行pyinstaller需要如下运行了:

pyinstaller you_entry_point.spec

输出单个exe文件

一般桌面端程序和较大型的项目是不推荐输出单个exe文件的,而对于一些小型的项目或者命令行工具,输出单个exe文件有时是很便捷的。然后在某些情况下你可能会遇到找不到python3.*.dll之类的错误,那么这个时候是一定要采用输出单个exe文件的方案的。

对于输出单个exe文件方案的spec文件,你先如下生成最基本的spec文件:

pyinstaller -F you_entry_point.py

然后接下来就是对该spec文件进行一些定制工作了。

环境配置和使用建议

你的python项目推荐使用虚拟环境,只安装必要的python依赖。然后python系统最好没有安装pyside2之类的模块,免得有干扰。然后你的pyinstaller安装在虚拟环境里面,一切命令执行也在虚拟环境里面。

这既有可能避免某些pyinstaller的bug和问题,也会减少你的安装包大小。

不弹出那个cmd窗口

exe=EXE 那里修改 console 字段为 False ,这样生成的exe在执行时将不会再弹出那个cmd窗口了。

修改输出exe名字

exe=EXE 那里修改 name 字段来修改目标输出exe的名字。

检查python包依赖情况

一般pyinstaller输出之后很多时候出问题是python包依赖没有正确检测到,通过查看build/{name}/xref-{name}.html 这个文件来确认python包依赖是否都加载进去了,没有则修改a = Analysis 下的 hiddenimports 字段,将缺失的模块名加入进去。

添加额外的文件

spec文件下配置 datas 这个列表值:

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

大概意思是把那里的那个文件copy到目标dist文件夹的那里。

python包里面的数据文件

推荐都规范为使用 pkg_resources 来管理:

from pkg_resources import resource_filename

但是这样你的数据文件exe程序还是不能使用的,你需要按照上面做的添加额外的文件,来把各个文件添加进去,比如:

             datas=[('yaogua/html_resource','yaogua/html_resource'),
             ('yaogua/yaogua.json','yaogua')],

上面是把yaogua模块的html_resource下的所有文件内容都复制到dist文件夹下的对应软件名的yaogua的html_resource那里,这样使用 resource_filename 引用路径仍是可行的可用的。