PyInstaller 是一个流行的第三方 Python 库,用于将 Python 程序打包成独立的可执行文件(如 .exe
)。打包后的程序可以在没有安装 Python 解释器和相关依赖的目标机器上直接运行。
本文是对图像分类和检测一体化平台系统的打包过程,当然中间经过了几十版的编译,还是有些小瑕疵,后面再慢慢完善吧。
Python 版本为 3.12.0
PyInstaller版本为 6.13.0
rmdir s q build
rmdir s q dist
rmdir s q labelPlatform.spec
pyinstaller --name="LabelPlatform" --windowed labelmain.py
# labelPlatform.spec (PyInstaller6.13.0 终极兼容版)
# -*- mode: python ; coding: utf-8 -*-
import os
fromPyInstaller.utils.hooksimport collect_dynamic_libs
PROJECT_DIR = r'D:\pycharmproject\LabelPlatform'
env_dir = os.path.join(PROJECT_DIR, '.venv')
block_cipher = None
# ---------------------- 二元组格式定义(Analysis阶段)----------------------
a = Analysis(
scripts=[os.path.join(PROJECT_DIR, 'labelmain.py')],
pathex=[PROJECT_DIR],
binaries=[],
datas=[
# 主资源目录(二元组格式)
(os.path.join(PROJECT_DIR, 'resource'), 'resource'),
(os.path.join(PROJECT_DIR, 'dataset'), 'dataset'),
(os.path.join(PROJECT_DIR, 'help'), 'help'),
(os.path.join(PROJECT_DIR, 'runs'), 'runs'),
# 图标文件(二元组格式,绝对路径)
(r'D:\pycharmproject\LabelPlatform\resource\icon\media.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\imagebrowser.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\biaozhu.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\tuxiangxunlian.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\datasplit.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\ehance.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\tuxiangmubiaojiance.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\transform.png', 'resource\\icon'),
(r'D:\pycharmproject\LabelPlatform\resource\icon\banzidongbiaozhu.png', 'resource\\icon'),
],
hiddenimports=[
'torch', 'torchvision', 'torchaudio',
'PyQt5', 'PyQt5.QtWebEngineWidgets',
'cv2', 'ultralytics', 'matplotlib.backends.backend_qt5agg'
],
excludes=['torch.cuda', 'torch.cuda.*', '_tkinter'],
)
# ---------------------- 三元组格式转换函数(EXE阶段)----------------------
def ensure_triple(items, default_type):
"""确保所有条目为三元组格式,处理格式异常"""
triple_items = []
for item initems:
iflen(item) == 2:
triple_items.append((item[0], item[1], default_type))
elif len(item) == 3:
triple_items.append(item)
else:
print(f"警告: 跳过非法条目 {item},长度 {len(item)}")
return triple_items
# ---------------------- 转换为三元组格式(EXE生成前)----------------------
a.datas = ensure_triple(a.datas, 'DATA')
a.binaries = ensure_triple(a.binaries, 'BINARY')
# ---------------------- 处理PyQt5插件(二元组转三元组)----------------------
qt_plugins_path = os.path.join(env_dir, 'Lib', 'site-packages', 'PyQt5', 'Qt', 'plugins')
qt_binaries = [
(os.path.join(qt_plugins_path, 'platforms', 'qwindows.dll'), 'PyQt5/Qt/plugins/platforms'),
(os.path.join(qt_plugins_path, 'webenginewidgets', '*'), 'PyQt5/Qt/plugins/webenginewidgets'),
]
a.binaries.extend(ensure_triple(qt_binaries, 'BINARY'))
# ---------------------- 处理PyTorchCPU库(三元组格式)----------------------
torch_libs = collect_dynamic_libs('torch')
a.binaries.extend(ensure_triple([
(src, dst) for src, dst in torch_libs
if'cuda' not in src.lower() and 'nvidia' not in src.lower()
], 'BINARY'))
# ---------------------- 生成EXE ----------------------
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='LabelPlatform',
icon=r'D:\pycharmproject\LabelPlatform\resource\icon\config.ico',
console=False,
)
第四步,执行打包pyinstaller --clean labelPlatform.spec
第五步,复制其他文件
xcopy E /I "D:\pycharmproject\LabelPlatform\resource" "dist\LabelPlatform\resource"
xcopy /E /I "D:\pycharmproject\LabelPlatform\dataset" "dist\LabelPlatform\dataset"
xcopy /E /I "D:\pycharmproject\LabelPlatform\help" "dist\LabelPlatform\help"
xcopy /E /I "D:\pycharmproject\LabelPlatform\runs" "dist\LabelPlatform\runs"

文章转载自追梦IT人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




