Pyinstaller打包
上一篇的后续,使用pyinstaller打包的一些注意事项。
上一篇的后续,使用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文件是用来配置各种路径的。
更多推荐
所有评论(0)