使用PyInstaller将Python项目快速打包为EXE可执行文件
1、安装pyinstaller
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
2、打包应用
2.1、使用命令行直接打包
pyinstaller -F -w -i your_path/log.ico main.py
命令:
-F 将项目打包为单个exe文件,没有其它文件-D 将项目打包为一个文件夹里面又有一个exe文件以及其它依赖,启动速度比-F快
-w 不显示命令窗口,如果需要调试可以不加
-i 打包后的exe文件的图标
–add-datas 添加数据
–add-binary 添加的二进制文件如dll文件等
。。。
这个命令将在当前目录下创建 dist
和 build
两个文件夹。dist
文件夹中包含了最终生成的可执行文件,而 build
文件夹包含了一些中间文件。
2.2、通过spec文件打包项目
首先通过以下命令生成一个spec文件:
pyi-makespec main.py
main.py是项目的入口文件,会在目录下生成一个main.spec,如下:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['main.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='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',
)
可以对main.spec文件里的内容进行修改:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( # 指定了需要打包的主程序文件(入口文件),这里是 main.py。 ['main.py'], # 指定了额外的模块路径,告诉 PyInstaller 在 ./core 目录下查找依赖的模块 pathex=['./core'], # 指定了需要包含的二进制文件及其打包后的相对路径 binaries=[('./core/kernel32.dll', './core'), ('./core/libifcoremdd.dll', './core')], # 指定需要包含在打包文件中的数据文件。这里是一个空列表,表示没有需要特别包含的数据文件 datas=[], # 指定需要显式导入的隐藏模块。在一些情况下,某些模块可能无法自动识别,需要手动指定导入 hiddenimports=[], # 指定了要加载的钩子脚本的路径。钩子脚本用于处理特定模块的打包细节或特定平台的问题 hookspath=[], # 指定了钩子脚本的配置选项。这里为空字典,表示不需要额外的配置 hooksconfig={}, # 指定了运行时需要加载的钩子脚本。运行时钩子可以用于在程序执行时进行特定的设置或修正 runtime_hooks=[], # 指定了需要排除的模块。有些模块可能不希望被打包进最终的可执行文件中,可以在这里进行排除 excludes=[], # Windows 平台的打包选项,指定是否优先使用重定向。重定向用于解决 Windows 上的某些动态库加载问题 win_no_prefer_redirects=False, # Windows 平台的打包选项,指定是否使用私有组件。私有组件可以确保打包的可执行文件在没有管理员权限的情况下也能运行 win_private_assemblies=False, # 指定了加密算法 cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( # 指定了之前创建的 PYZ 对象,即打包的 Python 代码和依赖库 pyz, # 指定了脚本文件列表 a.scripts, [], # 是否排除所有的二进制文件。在某些情况下,可能不希望将二进制文件打包进最终的可执行文件中 exclude_binaries=True, # 指定了可执行文件的名称 name='MTT', # 是否启用调试模式。调试模式会保留调试信息,便于在开发阶段进行调试 debug=False, # 是否忽略引导加载程序的信号 bootloader_ignore_signals=False, # 是否剥离调试信息。剥离调试信息可以减少最终可执行文件的大小,但会使得调试困难 strip=False, # 是否使用 UPX 压缩。UPX 是一个开源的可执行文件压缩工具,可以有效减小文件体积 upx=True, # 是否显示控制台窗口。如果设置为 False,生成的可执行文件将不会显示命令行窗口,适合 GUI 应用程序 console=False, # 是否禁用窗口模式下的回溯。在出现错误时,禁用窗口模式下的回溯可以防止用户看到详细的错误信息 disable_windowed_traceback=False, # 是否启用 argv 模拟。在某些情况下,特别是在处理命令行参数时,可能需要启用此选项 argv_emulation=False, # 目标架构,默认为 None。可以指定特定的目标架构,例如 x64 或 x86 target_arch=None, # 代码签名标识。在 macOS 上打包时,可以指定代码签名标识以便在 Gatekeeper 中验证 codesign_identity=None, # 权限文件。在 macOS 上打包时,可以指定额外的权限文件,用于授予应用程序特定的权限 entitlements_file=None, # 指定了可执行文件的图标。这里是指定了一个 ICO 图标文件的路径,用于设置可执行文件的图标 icon=['D:\\pysideGUI\\MTT2\\data\\logo.ico'], ) coll = COLLECT( # 指定了前面创建的 EXE 对象,即需要打包的可执行文件相关配置 exe, # 指定了需要包含的二进制文件列表 a.binaries, # 指定了需要包含的 ZIP 文件列表 a.zipfiles, # 指定了需要包含的数据文件列表 a.datas, # 是否剥离调试信息 strip=False, # 是否使用 UPX 压缩 upx=True, # 排除不需要使用 UPX 压缩的文件列表 upx_exclude=[], # 指定了生成的最终可执行文件的名称 name='MTT', )
修改完main.spec文件后运行以下命令:
pyinstaller main.spec
即可下目录先生成一个 build文件夹与 dist文件夹,我们需要的文件就在 dist文件夹里面
作者:不吃西红柿丿