PyInstaller .spec
文件详解
什么是 .spec
文件?
.spec
文件是 PyInstaller 用来配置打包过程的文件。它是一个 Python 脚本,包含了关于你的 Python 脚本及其依赖的所有详细信息。通过编辑 .spec
文件,你可以更细致地控制打包过程,包括添加数据文件、排除不必要的依赖、设置图标等。
生成 .spec
文件
当你使用 PyInstaller 打包 Python 脚本时,可以通过以下命令生成一个 .spec
文件:
bash复制
pyinstaller your_script.py
这将在当前目录下生成一个 your_script.spec
文件。你也可以使用 pyi-makespec
工具来生成 .spec
文件:
bash复制
pyi-makespec your_script.py
.spec
文件的结构
一个典型的 .spec
文件包含以下几个部分:
-
Analysis
:-
分析脚本和依赖项。
-
包括脚本路径、数据文件、隐藏导入、排除项等。
-
-
PYZ
:-
打包 Python 字节码。
-
-
EXE
:-
生成可执行文件的配置。
-
-
COLLECT
:-
收集所有文件并打包成一个文件夹或单个可执行文件。
-
以下是一个示例 .spec
文件:
Python复制
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['your_script.py'],
pathex=['.'],
binaries=[],
datas=[('config.ini', '.')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=['numpy', 'pandas'],
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,
a.binaries,
a.zipfiles,
a.datas,
[],
name='your_script',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
icon='icon.ico',
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='your_script',
)
配置 .spec
文件
-
Analysis
参数:-
scripts
: 脚本列表,包含所有需要打包的 Python 脚本文件的路径。Python复制
scripts=['your_script.py'],
-
pathex
: 搜索模块的路径列表。Python复制
pathex=['.'],
-
binaries
: 需要包含的二进制文件列表。Python复制
binaries=[],
-
datas
: 需要包含的数据文件及其目标目录。Python复制
datas=[('config.ini', '.')],
-
hiddenimports
: 隐藏导入的模块列表。Python复制
hiddenimports=[],
-
hookspath
: 自定义挂钩(hooks)的路径列表。Python复制
hookspath=[],
-
hooksconfig
: 挂钩配置字典。Python复制
hooksconfig={},
-
runtime_hooks
: 运行时挂钩的路径列表。Python复制
runtime_hooks=[],
-
excludes
: 排除的模块列表。Python复制
excludes=['numpy', 'pandas'],
-
win_no_prefer_redirects
: Windows 平台特定选项,是否优先使用重定向。Python复制
win_no_prefer_redirects=False,
-
win_private_assemblies
: Windows 平台特定选项,是否使用私有程序集。Python复制
win_private_assemblies=False,
-
cipher
: 加密密钥。Python复制
cipher=block_cipher,
-
noarchive
: 是否将纯 Python 模块存储在归档文件中。Python复制
noarchive=False,
-
-
PYZ
参数:-
pyz
: 包含纯 Python 模块的归档文件。Python复制
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
-
-
EXE
参数:-
pyz
: 包含纯 Python 模块的归档文件。Python复制
pyz,
-
a.scripts
: 脚本列表。Python复制
a.scripts,
-
a.binaries
: 二进制文件列表。Python复制
a.binaries,
-
a.zipfiles
: 压缩文件列表。Python复制
a.zipfiles,
-
a.datas
: 数据文件列表。Python复制
a.datas,
-
name
: 生成的可执行文件的名称。Python复制
name='your_script',
-
debug
: 是否启用调试模式。Python复制
debug=False,
-
bootloader_ignore_signals
: 是否忽略信号。Python复制
bootloader_ignore_signals=False,
-
strip
: 是否剥离可执行文件中的调试符号。Python复制
strip=False,
-
upx
: 是否使用 UPX 压缩可执行文件。Python复制
upx=True,
-
console
: 是否显示控制台窗口。Python复制
console=False,
-
icon
: 应用程序的图标文件。Python复制
icon='icon.ico',
-
-
COLLECT
参数:-
exe
: 生成的可执行文件。Python复制
exe,
-
a.binaries
: 二进制文件列表。Python复制
a.binaries,
-
a.zipfiles
: 压缩文件列表。Python复制
a.zipfiles,
-
a.datas
: 数据文件列表。Python复制
a.datas,
-
strip
: 是否剥离可执行文件中的调试符号。Python复制
strip=False,
-
upx
: 是否使用 UPX 压缩可执行文件。Python复制
upx=True,
-
upx_exclude
: 不使用 UPX 压缩的文件列表。Python复制
upx_exclude=[],
-
name
: 生成的文件夹或可执行文件的名称。Python复制
name='your_script',
-
示例
假设你有一个简单的 Python 脚本 hello.py
,内容如下:
Python复制
def main():
print("Hello, PyInstaller!")
if __name__ == "__main__":
main()
-
生成
.spec
文件:bash复制
pyinstaller --onefile hello.py
这将在当前目录下生成
hello.spec
文件。 -
编辑
.spec
文件: 打开hello.spec
文件,添加数据文件和排除不必要的依赖:Python复制
a = Analysis( ['hello.py'], pathex=['.'], binaries=[], datas=[('config.ini', '.')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=['numpy', 'pandas'], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )
-
打包: 使用编辑后的
.spec
文件进行打包:bash复制
pyinstaller hello.spec
这将生成一个包含
hello.exe
的dist
文件夹。
通过以上步骤,你可以更细致地控制 PyInstaller 的打包过程,确保生成的可执行文件符合你的需求。