PCM_Viewer/build_optimized.py

99 lines
3.2 KiB
Python
Raw Normal View History

2026-02-11 11:10:50 +08:00
"""
优化版打包脚本 - 加速启动时间
优化措施
1. 延迟导入大型模块QWebEngineView, InfluxDBClient
2. 排除不需要的模块
3. 不使用 UPX 压缩
4. 优化 Python 字节码
"""
import os
import sys
import shutil
import subprocess
def main():
# 检查是否安装了 PyInstaller
try:
import PyInstaller
except ImportError:
print("错误:未安装 PyInstaller")
print("请运行: pip install pyinstaller")
sys.exit(1)
# 解析命令行参数
onedir = "--onedir" in sys.argv
# 清理之前的构建
if os.path.exists("build"):
shutil.rmtree("build")
if os.path.exists("dist"):
shutil.rmtree("dist")
if os.path.exists("PCM_Viewer.spec"):
os.remove("PCM_Viewer.spec")
# 构建优化的 PyInstaller 命令
cmd = [
"pyinstaller",
"--name=PCM_Viewer",
"--windowed", # 不显示控制台窗口
"--onefile" if not onedir else "--onedir",
# ========== 启动速度优化 ==========
"--noupx", # 不使用 UPX 压缩UPX 会增加启动时间)
"--optimize=2", # Python 字节码优化级别0-22 最高)
# 排除不需要的大型模块(减少打包体积和启动时间)
"--exclude-module=matplotlib",
"--exclude-module=numpy",
"--exclude-module=pandas",
"--exclude-module=scipy",
"--exclude-module=PIL",
"--exclude-module=tkinter",
"--exclude-module=PyQt5", # 排除 PyQt5如果不需要
# 隐藏导入(延迟导入的模块)
"--hidden-import=PyQt6.QtWebEngineWidgets",
"--hidden-import=influxdb_client",
"--hidden-import=influxdb_client.client",
"--hidden-import=influxdb_client.client.write_api",
"--hidden-import=influxdb_client.client.query_api",
"--hidden-import=influxdb_wrapper",
# 只收集必要的 PyQt6 模块(不收集全部,减少体积)
"--collect-all=PyQt6.QtWebEngineWidgets", # WebEngine 需要完整收集
# 不收集其他大型库
"--collect-submodules=influxdb_client", # 只收集 influxdb_client 的子模块
"main.py"
]
print("开始打包(优化版)...")
print(f"模式: {'单文件' if not onedir else '文件夹'}")
print(f"优化措施: 延迟导入、排除不需要的模块、不使用 UPX")
print(f"命令: {' '.join(cmd)}")
print()
# 执行打包
result = subprocess.run(cmd, check=False)
if result.returncode == 0:
print("\n打包成功!")
if not onedir:
print("单文件位置: dist/PCM_Viewer.exe")
print("\n优化说明:")
print("1. 延迟导入 QWebEngineView 和 InfluxDBClient减少启动时间")
print("2. 排除了不需要的大型模块matplotlib, numpy 等)")
print("3. 不使用 UPX 压缩,避免解压时间")
print("4. 首次运行会在 exe 同目录创建配置文件")
else:
print("文件夹位置: dist/PCM_Viewer/")
print("可执行文件: dist/PCM_Viewer/PCM_Viewer.exe")
else:
print("\n打包失败!")
sys.exit(1)
if __name__ == "__main__":
main()
2026-02-24 17:20:18 +08:00