暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

用pyinstaller打包python应用

追梦IT人 2025-06-30
147

PyInstaller 是一个流行的第三方 Python 库,用于将 Python 程序打包成独立的可执行文件(如 .exe
)。打包后的程序可以在没有安装 Python 解释器和相关依赖的目标机器上直接运行。

本文是对图像分类和检测一体化平台系统的打包过程,当然中间经过了几十版的编译,还是有些小瑕疵,后面再慢慢完善吧。

  1.  Python 版本为 3.12.0

  2.  PyInstaller版本为 6.13.0 


第一步,清除历史遗留打包文件
rmdir s q build 
rmdir s q dist 
rmdir s q labelPlatform.spec

第二步,生成基础 SPEC 文件
pyinstaller --name="LabelPlatform" --windowed labelmain.py
第三步,替换 SPEC 文件
# 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论