代码写完了,打包成exe给用户。

单文件、无黑框、隐式导入、排除冗余——一次性搞定。

一、基础命令

bash

pip install pyinstaller
pyinstaller main.py --onefile --windowed
参数 作用
--onefile 打包成单个exe
--windowed 不显示控制台

二、Spec文件核心配置

python

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

hiddenimports = [
    'PySide6.QtCore',
    'PySide6.QtGui',
    'PySide6.QtWidgets',
    'qdarkstyle',
    'qtpy',
    'preprocess',
    'seg_multi_otsu',
    'morph_opt',
    'size_calc',
    'draw_result',
    'report_export',
]

excludes = [
    'PyQt5',
    'PyQt6',
    'tkinter',
]

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=hiddenimports,
    excludes=excludes,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='BSE电镜多相分析软件',
    debug=False,
    strip=False,
    upx=True,
    console=False,
)

三、重要配置说明

配置 说明
hiddenimports 手动添加隐式导入的模块
excludes 排除不需要的模块,减小体积
upx=True 使用UPX压缩
console=False 不显示控制台窗口

QT_API环境变量(main.py顶部):

python

import os
os.environ['QT_API'] = 'PySide6'

四、打包命令

powershell

$env:QT_API='PySide6'
pyinstaller build.spec --clean

--clean:清理缓存,重新打包。

五、常见问题

问题 原因 解决
多个Qt绑定冲突 同时装PyQt和PySide excludes排除PyQt5/PyQt6
qtpy模块找不到 错误排除了qtpy excludes移除qtpy
QLocalServer导入失败 打包环境问题 改用文件锁实现单实例
体积过大 打包了冗余模块 添加excludes排除未用模块

下篇预告

下一篇写完整使用流程与最佳实践:全流程操作指南,系列完结。