上一篇的后续,使用pyinstaller打包的一些注意事项。

文件目录

 

打包目标

生成一个资源可以替换、可以发布到别人电脑上的文件。

一些小小的注意事项

路径问题

因为是一个涉及到资源处理文件操作的程序,所以资源文件和操作对象的路径怎么写就成了一个很关键的问题。

解决方法一:使用绝对路径。没有问题,但不能移植到别人的电脑上。

解决方法二:发布的是一个文件包,里面包含exe和资源文件、被操作文件,根据文件包中的架构编写相对路径。

欲采用方法二。

方法二比较简单,只是类似于前端中,由于js文件(A)是在html文件(B)中被引入的,因此,在A中写调用资源文件C时,要注意调用的相对路径要基于B而不是A。同理,只要代码中的相对路径都是基于打包后生成的exe文件就好了。

Pyinstaller的参数问题:

-F 和 -D:

-F 会把程序和所有依赖的库打包成一个可执行文件,启动较慢;-D会生成一个文件夹,里面有可执行文件和依赖的库对应的文件,启动较快。推荐使用-D,因为根据网上的某篇文章,使用-F路径会更麻烦(Python打包exe遇到的坑,路径不对,文件找不到,递归超过最大深度等_吃苹果的程序猿的博客-CSDN博客

-i

用于设置图标。被选为图标的图像文件后缀名应为ico(其实只要下载一张图片,更改其后缀就好,这个方法对大多数格式都适用)。图标文件的相对路径要基于打包时所处的目录来写,我一般把图标文件和要被打包的py文件放在一个目录下,因此直接写图标文件的名称即可。

-c 和 -w:

-c对应cmd,带控制台窗口。-w对应windows,一般用在自带图形界面GUI的程序上,或者不想太初控制台窗口时。

如果代码中有print语句但exe程序不带控制台窗口,可能会报错。

控制台闪退

程序运行完成后,控制台会自己关闭。

应对方法一:引入time包,代码末尾加

time.sleep()

应对方法二:代码末尾加

input('请按任意键退出')

我个人的理解是,input会等待一个键盘输入,在键盘按键被按下前,程序不算执行完,控制台自然不会消失。(以上两种方法摘自下面的博客Python打包exe遇到的坑,路径不对,文件找不到,递归超过最大深度等_吃苹果的程序猿的博客-CSDN博客

打包流程

首先下载安装pyinstaller。

pip install pyinstaller

安装完成后,打开cmd,进入要被打包的文件(本文是main_4)所在的目录。

首先输入D:进入D盘(如果要进入E盘则是E:),然后输入cd+' '+文件所在路径。

这个程序是带图形界面的,因此在-w和-c中选择-w。

并不想把所有的依赖库都打包进一个exe文件(这样似乎不太好处理被调用/操作的外部文件),所以在-D和-F中选择-D(这里可以不写,因为默认选择-D)。

欲设置图标,选择R-C.ico为图标文件。

在cmd中输入如下命令:

pyinstaller -w -i R-C.ico main_4.py

开始打包,时间较长。

完成后,出现Build、dist文件夹及spec文件。

打包完成后,根据之前在原始代码中写入的资源/被操作文件的路径,把对应文件放到对应的位置(本文中为在dist目录下新建source文件夹,并将对应资源放入其中)。

之后,在dist中的main_4文件夹下找到main_4.exe文件,双击运行,发现没有问题。

将dist文件移动到其他位置,其中的exe文件仍能正常运行。

Over!

其他问题

打包后体积过大

可能是引入的包过多,或者当前环境下下载的包过多。

解决方案一:减少引入,能from xxx import xxx,就不要import xxx。(本次然并卵了,用list代替了ndarray,没有引入numpy,但包的大小基本一致……)

解决方案二:创建虚拟环境,在其中之下必须的包,在虚拟环境下打包。

不理解spec文件和Build文件夹的作用

理论上来讲spec文件是用来配置各种路径的。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐