使用Spec文件配置编译

即便是使用了命令行参数,PyInstaller最终还是要生成一个Spec文件来描述编译配置,并最终按照Spec文件的描述来生成可执行的文件包。在大部分情况下,你并不需要对Spec文件进行额外的编辑,就可以完成可执行文件包的编译和生成。但是如果需要更加详细的设置或者自定义某些设置,就需要对Spec文件进行进一步编辑后再进行编译和生成操作。

使用Spec文件进行编译的命令与直接编译源代码文件不同,再次执行编译源代码文件的命令将会让PyInstaller重写Spec文件。让PyInstaller使用Spec文件进行编译只需要使用pyinstaller SPEC_FILE即可。

一般在以下四种情况下使用Spec文件进行编译打包是非常便利的。

  1. 打包应用中需要附加一些额外的非二进制文件。
  2. 打包应用中需要附加一些运行时链接库(DLL或者SO文件),但PyInstaller并不能自行确定这些库的来源位置。
  3. 需要在可执行文件中添加Python解释器的运行时选项。
  4. 需要制作一个包含多个程序的打包应用。

通用配置

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文件的内容进行书写。