97 lines
3.2 KiB
Python
97 lines
3.2 KiB
Python
"""
|
||
打包脚本 - 使用 PyInstaller 打包 PCM Viewer
|
||
|
||
使用方法:
|
||
python build.py # 打包为单文件(推荐)
|
||
python build.py --onedir # 打包为文件夹
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import shutil
|
||
import subprocess
|
||
|
||
def get_resource_path(relative_path):
|
||
"""获取资源文件的绝对路径(支持打包后的单文件模式)"""
|
||
try:
|
||
# PyInstaller 创建的临时文件夹
|
||
base_path = sys._MEIPASS
|
||
except Exception:
|
||
# 开发环境:使用脚本所在目录
|
||
base_path = os.path.dirname(os.path.abspath(__file__))
|
||
return os.path.join(base_path, relative_path)
|
||
|
||
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-2,2 最高)
|
||
# 排除不需要的大型模块(减少打包体积和启动时间)
|
||
"--exclude-module=matplotlib",
|
||
"--exclude-module=numpy",
|
||
"--exclude-module=pandas",
|
||
"--exclude-module=scipy",
|
||
"--exclude-module=PIL",
|
||
"--exclude-module=tkinter",
|
||
# 隐藏导入(延迟导入的模块)
|
||
"--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 需要完整收集
|
||
"main.py"
|
||
]
|
||
|
||
print("开始打包...")
|
||
print(f"模式: {'单文件' if not onedir else '文件夹'}")
|
||
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. 首次运行会在 exe 同目录创建配置文件")
|
||
print("2. dashboard.json 和 influx_settings.json 会保存在 exe 同目录")
|
||
else:
|
||
print("文件夹位置: dist/PCM_Viewer/")
|
||
print("可执行文件: dist/PCM_Viewer/PCM_Viewer.exe")
|
||
else:
|
||
print("\n打包失败!")
|
||
sys.exit(1)
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
|