观看前可先食用另一篇文章
https://blog.csdn.net/m0_43406494/article/details/112697296
提供一个spec文件样例
# -*- mode: python ; coding: GBK -*-
block_cipher = None
a = Analysis(['test2.py'],
pathex=['C:\\Users\\tumbled\\Desktop'],
binaries=[],
datas=[(r"C:\Users\tumbled\Downloads\周柏豪 - 够钟.mp3","music")],
hiddenimports=[],
hookspath=[],
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='test2',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False , icon='test2.ico')
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='test2')
使用pyinstaller命令时,先生成一个spec文件,存放在specpath路径下,默认为当前路径
Spec文件告诉pyinstaller如何生成可执行文件
实际上spec文件里面的内容就是python代码
使用了三个函数,Analysis、PYZ、EXE
很多情况下并不需要修改spec文件,直接在命令行上面提供参数给pyinstaller即可满足使用
有如下四种情况需要修改spec文件
把数据文件跟app一起打包
把动态连接库一起打包
添加运行时选项
想要生成多个可执行程序,公共的模块分割出来给其他调用
使用pyi-makespec命令来只生成spec文件,而不接着去生成可执行文件
用法跟pyinstaller一样
有了spec文件之后,可以使用pyinstaller命令来由spec文件生成可执行文件,因为生成spec文件时给命令行的参数都编码进spec文件里面了,这个时候再在命令行使用一些参数会被直接无视!而只考虑spec文件里面的参数
这个时候,只要下面一些参数会有效果(不过好像用处都不大。。。)
The following is a shortened example of a spec file for a minimal, one-folder app:
使用了one-file参数(F参数)时没有COLLECT函数的调用,EXE对象接收了所有的脚本、模块和二进制文件
Analysis类返回的对象有成员如下,scripts成员为py脚本的文件名,pure成员为纯粹的python模块(即导入库,binary成员包含add-binary参数的值,datas参数包含add-data参数的值
PYZ对象包含a.pure里面所有的模块
EXE对象由被分析的脚本和PYZ文件生成
COLLECT对象由所有其他部分生成输出文件夹
可以修改spec文件里面Analysis和EXE的参数
打包成one-folder时,文件和执行文件放在同一个文件夹下,打包成one-file时,文件打包进可执行文件里,运行时会解压出来
使用–add-data参数来添加文件,或者修改spec文件,传参给Analysis函数的datas参数,datas参数接收一个列表,列表成员是一个二元组,第一个值是被包含的文件在系统中的路径,第二个值是运行时文件所在的位置(因为one-file模式下会解压出来)
使用add-data参数的方式
可以使用通配符 *
直接使用*来包含文件夹下面所有的文件
运行时,/mygame/data的内容会放在data文件夹下面
如下例
from subprocess import Popen
import time
Popen(r'music\周柏豪 - 够钟.mp3', shell=True)
time.sleep(10)
代码中使用上面的路径
Spec文件修改如下
Datas参数传入mp3文件的系统路径和运行时存放的路径
另外因为使用了中文,而且spec文件也是python代码,因此修改首行为coding: GBK
one-folder打包生成时,test2文件夹下面多了个music文件夹,存放了文件内容
动态连接库这些文件才是用add-binary参数(pyinstaller需要递归查找二进制依赖的),其他图像、文本文件都是使用add-data
类似于前面的用法,传给binaries参数
使用场合如下