本文python文件打包用到的是pyinstaller库并且以如下格式的文件为例
其中bird.py用到了images文件夹当中的png
pyinstaller有两种打包方式:
方法1:文件夹模式 onedir
在终端用命令
pyinstaller -D flappybird.py
执行完后文件格式如下
可以看到多了.idea,pycache,build,dist,还有bird.spec四个文件
-
.idea
文件夹, 当使用pycharm作为IDE时,会自动生成.idea/文件夹来存放项目的配置信息。其中包括版本控制信息、历史记录等等 -
_pycache_
文件夹, 任何python工程运行时python解释器会将 *.py 脚本文件进行编译,并将编译结果保存到__pycache__目录中,下次再执行工程时,若解释器发现这个 *.py 脚本没有修改过,就会跳过编译这一步,直接运行以前生成的保存在 __pycache__文件夹里的 *.pyc 文件。 -
build
文件夹,一个临时文件,相当于pyinstaller的工作空间,pypnstaller运行相关的文件和日志都在这个文件夹中,打包完成后可以直接删除。 -
dist
文件夹:运行完成后会在同路径下生成一个dist文件夹,这个文件夹下有一个跟程序同名的文件夹,打包好的exe程序就在这个文件夹下,在使用-F这种文件夹方式打包时需要把整个dist文件发给别人别人才能使用, -
spec
文件,打包的配置文件,可以配置依赖资源。spec文件中主要包含4部分:Analysis、PYZ、EXE、COLLECT
analysis:主要是分析py文件的依赖信息
PYZ:是一个.pyz的压缩包,包含程序运行需要的依赖
EXE:是根据上述两项内容而生成的
COLLECT:主要是输出信息
这时候我们试一下打开dist文件中的exe文件,发现提示找不到images文件,可见在需要实现资源依赖的时候直接打包并不能实现需求,这时候需要我们修改spec文件,在里面的Analysis中的datas中添加资源依赖,datas中的数据以元组的形式储存,例如我们要添加这个文件目录下的images文件夹,则把datas=[]替换为datas=[(‘images’,‘images’)],第一个images表示要放入的文件的路径(这里我们用的是相对路径),第二个images代表引用的名字
这时候再试一下打开exe文件发现还是不行,因为dist文件中没有images文件夹,所以我们把images文件夹放入dist文件中,然后就成功了
方法2: 单文件模式 onefile
加上-F参数,全部的依赖文件都会被打包到exe文件中,在dist文件夹中只有一个可执行文件,这种情况与但文件夹模式不同的是如果没有要求的资源文件,那么直接把exe文件发给别人即可,但是-D不管怎么样都需要把dist文件发给别人
pyinstaller -F bird.py
这种情况下同样是需要把资源文件images放入dist当中的
spec配置文件方式打包
生成spec文件
:pyi-makespec [options] xxx.py [other scripts…],生成spec文件时可以什么都不指定,然后在生成的spec文件中单独配置,默认为-D模式下的spec文件,也可以指定生成-F模式的spec文件。当然也可以在第一次就将参数选项指定好,以后就只维护spec文件。
参数选项
:生成spec文件的参数选项和命令行模式下执行PyInstaller打包是完全一样的。
spec文件类型
:spec文件其实就是一个py文件,在编辑时可以直接将它当成一个py文件来使用。
spec文件优势
:一般情况而言,直接使用PyInstaller命令行直接打包即可,但是以下情况使用spec文件的话会方便一些:
1.程序需要绑定一些数据文件,可以在spec文件中单独用一个列表变量来指定,可读性和可维护性会高很多。
2.需要include一些PyInstaller不知道的动态链接库,如:.dll/.so文件,同样可以在spec文件中单独用一个列表变量来指定。
3.需要往可执行文件中添加一些运行时选项,如hook文件。
pyinstaller打包多个python文件
如果在A中import B,那么A是入口文件,要把这个程序打包,则可以在后面直接加入相关联的B,C,D …
pyinstaller的一些别的options
- -i
用于设置图标。被选为图标的图像文件后缀名应为ico(其实只要下载一张图片,更改其后缀就好,这个方法对大多数格式都适用)。图标文件的相对路径要基于打包时所处的目录来写,我一般把图标文件和要被打包的py文件放在一个目录下,因此直接写图标文件的名称即可。
- -c 和 -w:
-c对应cmd,带控制台窗口。-w对应windows,一般用在自带图形界面GUI的程序上,或者不想太初控制台窗口时。
如果代码中有print语句但exe程序不带控制台窗口,可能会报错。