pyinstaller
-
安装
/******************安装命令********************/ pip install pyinstaller
-
验证安装情况
pip list /*************输出****************/ pyinstaller 6.2.0 pyinstaller-hooks-contrib 2023.10
-
生成 spec文件
pyinstaller xx.py
-
spec注释说明
a = Analysis( ['python_to_exe.py'], pathex=[], binaries=[], datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='python_to_exe', 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.datas, strip=False, upx=True, upx_exclude=[], name='python_to_exe', )
变量 | 含义 |
---|---|
a | Analysis类的实例,要求传入各种脚本用于分析程序的导入和依赖。 |
pyz | PYZ的实例,是一个.pyz文件,包含了所有pure中的所有Python模块。 |
exe | EXE类的实例,这个类是用来处理Analysis和PYZ的结果的,也是用来生成最后的exe可执行程序。 |
coll | COLLECT类的实例,用于创建输出目录。在-F模式下,是没有COLLECT实例的,并且所有的脚本、模块和二进制文件都包含在了最终生成的exe文件中。 |
block_cipher | 加密密钥 |
Analysis参数变量 | 含义 |
---|---|
scripts | 它是一个脚本列表,可以传入多个py脚本 |
pathex | 默认spec的目录. |
datas | 将本地文件打包时拷贝到目标路径下。datas是一个元素为元组的列表,每个元组有两个元素,都必须是字符串类型,元组的第一个元素为数据文件或文件夹,元组的第二个元素为运行时这些文件或文件夹的位置。例如:datas=[(’./src/a.txt’, ‘./dst’)],。 |
binaries | 添加二进制文件,也是一个列表,定义方式与datas参数一样 |
hiddenimports | 指定脚本中需要隐式导入的模块,比如在__import__、imp.find_module()、exec、eval等语句中导入的模块,这些模块PyInstaller是找不到的,需要手动指定导入,这个选项可以使用多次 |
hookspath | 指定额外hook文件(可以是py文件)的查找路径,这些文件的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑(并不会改变这些库本身的代码),以便能顺利的打包完成 |
runtime_hooks | 指定自定义的运行时hook文件路径(可以是py文件),在打好包的exe程序中,在运行这个exe程序时,指定的hook文件会在所有代码和模块之前运行,包括main文件,以满足一些运行环境的特殊要求 |
excludes | 指定可以被忽略的可选的模块或包,因为某些模块只是PyInstaller根据自身的逻辑去查找的,这些模块对于exe程序本身并没有用到 |
exe参数变量 | 含义 |
---|---|
console | 设置是否显示命令行窗口 |
icon | 设置程序图标,默认spec是没有的,需要手动添加,参数值就是图片路径的字符串 |
打包
资源路径
当有使用到资源文件时这个时候需要特别注意,由于资源文件需要拷贝到打包文件中,其路径层级就会发生变化,这个时候还使用 sys模块获取到的路径就会在打包后出现异常,因此可以通过以下这段代码获取获取整个软件的root目录,在以此目录为根目录层级查找资源文件。
def root(self):
if getattr(sys, 'frozen', False):
current_dir = sys._MEIPASS
else:
current_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(current_dir, ".")
return file_path
资源打包示例
#指定打包文件
file = ['python_to_exe.py'],
#资源路径
#./resouce 即当前软件路径下的 resouce
#resouce 即打包后资源文件夹拷贝的路径
add_file=[('./resouce','resouce')]
a = Analysis(
file, //指定打包文件列表
pathex=['./'], //指定打包路径
binaries=[],
datas=add_file, //指定资源文件列表
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='python_to_exe', # 打包exe输出名称
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False, #关闭控制台输出
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='./idget.ico' #程序图标
)
图形化的配置pyinstaller进行打包的工具: auto-py-to-exe
pip install auto-py-to-exe
# 启动工具
auto-py-to-exe