之前在讲打包模式的时候,提到了在打包后会产生一个spec文件,这个文件其实就是个Python文件。这个文件会把要打包的脚本和使用的打包命令进行编码,然后告诉Pyinstaller应该怎么样来进行打包,比如要使用哪些命令,要添加哪些资源。
有时候我们要打包的情况比较复杂,比如要添加很多资源、对很多参数进行设置,那么这样一来,我们手敲打包命令时就会导致命令很长,而且也容易出错。并且,我们在打包程序时也经常要打包好几次才能成功。每次打包都敲一遍这么长的命令是很麻烦的。这个时候那可以用spec文件来打包。
首先,我们使用pyi-makespec命令来单独生成spec文件,这种情况下,没有打包操作,也不会生成build和dist文件夹。
>>> pyi-makespec 打包.py
我们可以在pyi-makespec和打包.py
之间添加其他Pyinstaller命令,而生成的spec文件也会进行记录。
spec文件其实就是个文本文件,我们可以通过记事本程序或者其它文本程序打开查看并编辑它。
打开后,我们可以看到,这个文件里的语法就是Python的语法。很多参数都是之前参数介绍章节中介绍了的。通过修改spec文件中对应的变量内容,就可以达到使用命令时添加参数的效果。
之前生成的spec文件内容如下:
-- mode: python ; coding: utf-8 --
block_cipher = None
a = Analysis([‘打包.py’],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name=‘打包’,
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name=‘打包’)
spec文件中包含了1个变量(block_cipher)和4个类:Analysis、PYZ、EXE、COLLECT。这里对它们简单进行解释:
Analysis
:主要接收一系列的脚本名作为输入,它会分析所有导入的模块以及其他依赖等。Analysis类中的pathex定义了打包的主目录,对于在此目录下的py文件可以只写文件名不写路径。
PYZ
:会生成所有相关pyz文件并进行归档,最终会打包进可执行文件中
EXE
:会在分析好的脚本以及pyz文件基础上生成可执行文件。其中,Console=False代表程序运行时不带CMD窗口。
COLLECT
:文件夹模式下,COLLECT会创建用于存放各文件的文件夹。而单文件模式下,COLLECT不会被用到,EXE会直接接收所有的脚本,模块以及二进制文件。所以,如果是-F参数(单文件)生成的spec文件是不会有这个类的。
如果读者看过了前面的各个小节,那对spec文件中大部分的参数应该都已理解。接下来我们介绍在spec文件中一些经常会修改的内容项:
Analysis.datas
:这可以设置在打包后的程序中添加资源文件。比如:datas=[(‘./a.txt’, ‘.’),(‘./b.jpg’, ‘.’)],这个就是将打包时工作目录中的a.txt文件和b.jpg作为资源文件,最后复制到打包后的目录下。如果还有其它资源文件,则继续添加元组。
Analysis. hiddenimports
:这个可以设置打包程序时要导入的库的名称。如:hiddenimports=[‘pandas’, ‘numpy’]
Analysis. excludes
:这个可以设置打包程序时不要导入的库的名称。如:excludes=[‘pandas’, ‘numpy’]
EXE. exclude_binaries
:设置打包模式,True:文件夹模式;False:单文件模式。
EXE.upx
:设置是否使用upx压缩。
EXE.upx_exclude
:upx压缩时跳过压缩项。比如upx_exclude =[‘vcruntime140.dll’] 则代表压缩时不压缩vcruntime140.dll动态库。
EXE.console
:设置是否在运行程序时显示cmd窗口。True代表显示,False代表不显示。建议第一次打包时带上。如果运行出现什么问题,可以在cmd窗口中显示。
EXE. icon
:设置程序的图标。
在修改spec文件后,我们可以直接用下面的命令来打包:
>>> Pyinstaller 打包.spec
除了那些可以在spec中配置的,基于spec文件打包的话,Pyinstaller和spec之间常用的命令只有以下几个:
–clean、-y、–log-level
如果修改了代码,想要重新打包,我们只需要相应地调整spec文件中的内容(或者可能不需要调整),然后再次打包就行,不需要在cmd窗口中重新再输一遍那么长的命令。
在spec时,由于经常要添加资源文件,这就涉及到了路径问题。在Python中,相对路径和绝对路径的写法如下:
相对路径:
datas=[(‘./a.txt’, ‘.’)
datas=[(‘./a.txt’, ‘./b’)
datas=[(‘./Setting.ini’, ‘.’), (‘./百度.xlsx’, ‘.’), (‘./新浪.xlsx’, ‘.’), (‘./Main.ui’, ‘.’),
绝对路径:
datas=[(r’C:\Setting.ini’, ‘./scrapy’)]