使用Spec文件配置编译
即便是使用了命令行参数,PyInstaller最终还是要生成一个Spec文件来描述编译配置,并最终按照Spec文件的描述来生成可执行的文件包。在大部分情况下,你并不需要对Spec文件进行额外的编辑,就可以完成可执行文件包的编译和生成。但是如果需要更加详细的设置或者自定义某些设置,就需要对Spec文件进行进一步编辑后再进行编译和生成操作。
使用Spec文件进行编译的命令与直接编译源代码文件不同,再次执行编译源代码文件的命令将会让PyInstaller重写Spec文件。让PyInstaller使用Spec文件进行编译只需要使用pyinstaller SPEC_FILE
即可。
一般在以下四种情况下使用Spec文件进行编译打包是非常便利的。
- 打包应用中需要附加一些额外的非二进制文件。
- 打包应用中需要附加一些运行时链接库(DLL或者SO文件),但PyInstaller并不能自行确定这些库的来源位置。
- 需要在可执行文件中添加Python解释器的运行时选项。
- 需要制作一个包含多个程序的打包应用。
通用配置
Spec文件是一个标准的Python脚本文件,其中分为几个部分,Analysis
是对源代码的分析,并定义要包含的文件和库等。PYZ
是打包配置。EXE
是Windows系统可执行文件的编译配置。BUNDLE
是用于配置macOS中的APP程序包的配置信息。COLLECT
用于在使用--onedir
方式输出应用时,对所有需要的内容进行收集;在使用--onefile
时不会出现。
Analysis
的常见格式如下:
a = Analysis(['main.py'],
pathex=['/project-folder'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
cipher=block_cipher)
Analysis中的内容与前面命令行参数中的配置内容十分相似,命令行参数中的大部分内容也的确都可以在这里进行配置。其中Analysis的第一个参数用于指定应用的入口代码文件;pathex
用于指定PyInstaller寻找相关模块、包以及链接库的位置;binaries
用于向应用中增加二进制文件,相当于--addbinary
参数的作用;datas
用于向应用中增加非二进制文件,相当于--add-data
参数的作用。
使用datas
添加非二进制文件的格式为datas=[('filename', 'path')]
,其中path
是最终的程序包中用于存放该文件的目录名称。打包进程序包中的非二进制文件可以通过包pkgutil
中的功能进行访问,例如有配置datas=[('help.txt', 'help')]
可以通过pkgutil.get_data('help', 'help.txt')
来获取。
与非二进制文件相似,二进制链接库的添加和使用的方法也是一样的。
PYZ用于描述源码编译后的可执行文件包的组成,其中包括了Analysis中添加的全部内容。一般情况下这一部分内容无需进行调整修改。
编译Windows可执行文件
EXE
用于输出可执行文件,这部分输出的并不一定是Windows的可执行文件,而是会根据当前系统,生成相应的可执行文件。
这一部分主要是对可执行文件的特征进行配置,例如UPX配置、输出文件名、是否使用命令行处理标准IO等等。其中关于编译好的程序都是从PYZ和Analysis中继承来的,如果需要修改这些内容,需要到相应的部分去修改。此外,为Python解释器添加参数也是在这一部分完成的,可以在a.scripts
后的列表参数中添加。
编译macOS可执行App
当使用--onefile
和--windowed
参数在macOS上进行编译时,会默认生成APP应用包。macOS的APP应用包是在EXE部分的基础之上进行配置,并添加了针对macOS的独有的配置项。
用于配置macOS应用包打包的配置项由BUNDLE定义,其中常用的配置项有以下这些。
name
,应用包名称。icon
,应用包的图标。bundle_identifier
,应用包的唯一化标识。info_plist
,应用包中的info.plist
配置,可以根据实际info.plist
文件的内容进行书写。