Pyinstall 打包.py文件 生成exe可执行文件
原本认为很轻松的事情,结果花了近2个小时才搞定,值得记录下踩的坑。
首先粗略小结一下这个python工具包的基本工作原理
就是说,如果需要这个工具包帮忙打包一下,形成.exe
文件,咱就只需要关注一件事:.spec
配置文件配对了没。
基本上,只要这个文件里路径配对了,生成可执行文件,不在话下😂
花花网络迷人眼,搜索引擎送来的坑都给我放哪儿了呢?就是文件路径的配置上!
不过咱们先看正确步骤(不浪费时间,有闲心的可以接着看步骤后的“如何出坑”):
pyinstall 工具包打包的正确步骤
1、生成配置文件:pyi-makespec [-w] 主文件(一般是main.py) 其他文件1 其他文件2
2、补充配置文件:主要确认是否有文件没有写进打包范围,打包路径是否正确,静态文件路径有没有配好,也可以指定生成的文件名
3、执行配置文件:pyinstaller xxx.spec
4、打包成功,去.\\工程文件\dist 文件夹下 可以找到你的可执行文件,双击运行~
如何入坑&出坑
搜索引擎提供的大部分方法都是一把梭哈的,就是直接给你一个超长的命令行,告诉你应该填的命令+对象
但实际上,你的打包情况是复杂的,比如,多个文件可能是跨多model的,或者某个文件的层级很深,跟主文件根本不在一个目录
配置文件 .spec
是结构性的文件,配置项都给你准备好了,正常的思路应该是去了解配置文件允许你填什么/要求填什么,这决定它是根据什么条件去给你打包的,这就跟我们写程序是一样的,我们需要根据工具提供的参数来使用,否则就是在测bug了,并且大部分还是主观意义下的bug,这显然毫无意义,但大部分搜索引擎提供的结果却基本都是如此,对基本使用原理给的很模糊:
比如,直接告诉你,根据xxx命令一条命令行,就能大力出奇迹
再比如,有些连参数作用都没搞明白的,就开始瞎教,说配某个参数就能执行,比较典型的是[-p]
参数的用法,这个参数明明是用来配用到的模块的路径的,对应的是配置文件里的pathex
选项,大部分文章却说这是配其他文件的,这样的指导显然不能让使用者据此得到正常的期望结果。
所以,还是先从配置文件本身了解吧:
# -*- mode: python ; coding: utf-8 -*-
#兼容的写法
block_cipher = None
'''
Analysis类的实例,主要分析.py文件的依赖项。
如,第三方库,以及import模块。
scripts:py文件
pure :纯python模块,包括程序的代码文件本身
binaries:需要的二进制文件
datas:非二进制文件,例如icon
'''
a = Analysis(
['main.py', 'OOP_GUI_CREATE_TEST_DATA.py', 'OOP_test_date_create.py'],
# 你要打包的文件名,如果偷懒,可以和main文件放一个目录
# 不在一个目录的时候,要写绝对路径
pathex=[],
#用来存放用到模块路径,例如PYTHONPATH
binaries=[],
#添加二进制文件,也是一个列表,定义方式与datas参数一样
datas=[],
#非二进制文件
hiddenimports=[],
#隐式导入的模块,比如在__import__、eval等语句中导入的模块,这些模块Pyinstall是找不到的,需要手动指定导入。
hookspath=[],
#hookspath,指定额外的hook文件(可以是py文件)的查找路径。
hooksconfig={},
runtime_hooks=[],
#指定自定义的运行时hook文件路径(可以是py文件)
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='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True,
disable_windowed_traceback=False,
argv_emulation=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='main',
)
Analysis 实例
除了scriptsde 的添加,datas的添加暂时没用到过其他的(跨平台部署也没用到过),如果后续有用到的其他属性,会在这里继续更新~
属性 | 解释 | |
---|---|---|
scripts | 必填,由脚本文件名组成的list | |
pathex | 选填,spec文件路径,通常是跨平台才会用这个 | |
binaries | 选填,二进制文件 | |
datas | 选填,非二进制文件 | |
hiddenimport | 选填,如果用了些隐式的模块,才需要填这个,因为Pyinstall不能主动帮你加载隐式model | |
hookspath | 选填,hook或者hook-modules路径 | |
hooksconfig | 选填,hook或者hook-modeles的配置文件 | |
excludes | 选填,模块或包名,不能填路径名,这些包/模块将会被忽略,不打包 | |
runtime_hooks | 选填,用作用户运行时可选hook脚本列表(填文件名) | |
cipher | 添加 pyz_crypto.PyiBlockCipher 类的可选实例(使用提供的密钥)。 | |
win_no_prefer_redirects | True,在搜索 Windows SxS 程序集时不希望遵循版本重定向。默认False | |
win_private_assemblies | True, 则将所有捆绑的 Windows SxS 程序集更改为私有程序集以强制执行,默认False | |
noarchive | True,则不要将源文件放在存档中,而是将它们作为单独的文件保存。默认False |
其他实例
PYZ 实例 | .pzy文件,包含pure中的所有Python模块 | |
---|---|---|
EXE 实例 | 处理Analysis 和PYZ的结果,用来生成最后的exe可执行文件 | |
COLLECT 实例 | 用于创建输出目录,只有-D命令下才会实例化,-F不会生成目录 |
常用参数
参数名称 | 含义 |
---|---|
-h | 查看帮助信息:pyinstaller -h |
-p DIR, --paths DIR | -p DIR 或者 --paths DIR 搜索导入的路径(例如使用 PYTHONPATH)。 允许多个路径,由 ; 分隔,或多次使用此选项。 等效于在规范文件中提供 pathex 参数。 |
-F, --onefile | 创建一个单一文件捆绑的可执行文件。 |
-D,–onedir | 创建一个包含可执行文件的单文件夹包(默认) |
-n NAME, --name NAME | 分配给捆绑的应用程序和规范文件的名称(默认值:第一个脚本的基本名称) |
–clean | 在构建之前清理 PyInstaller 缓存并删除临时文件。 |
pyi-makespec mainNAME.py | 单纯构建一个spec配置文件 |