88 lines
3.2 KiB
Python
88 lines
3.2 KiB
Python
|
|
import os
|
|||
|
|
import subprocess
|
|||
|
|
import sys
|
|||
|
|
import shutil
|
|||
|
|
|
|||
|
|
# 确保我们在虚拟环境中运行
|
|||
|
|
if not sys.prefix == sys.base_prefix:
|
|||
|
|
print(f"正在使用虚拟环境: {sys.prefix}")
|
|||
|
|
else:
|
|||
|
|
print("警告:你似乎没有激活虚拟环境!建议在 venv_clean 下运行。")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def build():
|
|||
|
|
entry_point = "runDecoder.py" # 你的入口文件
|
|||
|
|
|
|||
|
|
# 自动清理逻辑优化
|
|||
|
|
output_dir = "dist2"
|
|||
|
|
build_dir = "build2" # Nuitka 默认会在当前目录生成 .build 文件夹
|
|||
|
|
|
|||
|
|
if "--clean" in sys.argv:
|
|||
|
|
print("清理旧构建目录...")
|
|||
|
|
for folder in [output_dir, build_dir, entry_point.replace(".py", ".build")]:
|
|||
|
|
if os.path.exists(folder):
|
|||
|
|
shutil.rmtree(folder, ignore_errors=True)
|
|||
|
|
|
|||
|
|
# Nuitka 命令 - 此时非常清爽
|
|||
|
|
nuitka_cmd = [
|
|||
|
|
sys.executable, "-m", "nuitka",
|
|||
|
|
"--standalone", # 独立运行模式
|
|||
|
|
f"--output-dir={output_dir}", # 输出目录
|
|||
|
|
"--show-progress", # 显示进度
|
|||
|
|
"--assume-yes-for-downloads", # 自动下载依赖(如 ccache, depends 等)
|
|||
|
|
|
|||
|
|
# --- 插件配置 ---
|
|||
|
|
"--enable-plugin=numpy",
|
|||
|
|
"--enable-plugin=matplotlib",
|
|||
|
|
"--enable-plugin=torch", # 处理 PyTorch 及其 CUDA 依赖
|
|||
|
|
|
|||
|
|
# --- 包含包/模块 (Nuitka 2.x 推荐使用 include-package-data 或 include-package) ---
|
|||
|
|
# --collect-all 是 PyInstaller 的参数,Nuitka 不支持
|
|||
|
|
"--include-package=sklearn",
|
|||
|
|
"--include-package=scipy",
|
|||
|
|
"--include-package=mne",
|
|||
|
|
|
|||
|
|
# 强制包含 MNE 的数据文件(配置、布局等)
|
|||
|
|
"--include-package-data=mne",
|
|||
|
|
"--include-package=PIL", # Pillow (matplotlib/mne 可能用到)
|
|||
|
|
"--include-package=networkx", # mne 可能用到
|
|||
|
|
"--include-package=decorator", # MNE 核心依赖,防止 KeyError: 'self'
|
|||
|
|
"--include-package=six", # 通用兼容库
|
|||
|
|
|
|||
|
|
# 显式包含本地模块,防止隐式导入丢失
|
|||
|
|
"--include-module=infer_pth",
|
|||
|
|
|
|||
|
|
# --- 数据文件 ---
|
|||
|
|
# 格式: 源路径=目标路径 (相对 dist 目录)
|
|||
|
|
"--include-data-dir=model=model",
|
|||
|
|
"--include-data-dir=raw_data=raw_data",
|
|||
|
|
|
|||
|
|
# --- 排除干扰以减小体积/提高稳定性 ---
|
|||
|
|
"--nofollow-import-to=pytest",
|
|||
|
|
"--nofollow-import-to=unittest",
|
|||
|
|
"--nofollow-import-to=pdb",
|
|||
|
|
"--nofollow-import-to=tkinter", # 如果不用 GUI 界面
|
|||
|
|
"--nofollow-import-to=sympy", # 除非明确用到符号计算
|
|||
|
|
|
|||
|
|
# --- 内存与性能 ---
|
|||
|
|
"--low-memory", # 降低打包时的内存消耗
|
|||
|
|
|
|||
|
|
# --- Windows 特定 ---
|
|||
|
|
# "--disable-console", # 如果不需要黑框,取消注释这一行
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
nuitka_cmd.append(entry_point)
|
|||
|
|
|
|||
|
|
print("开始打包...")
|
|||
|
|
try:
|
|||
|
|
subprocess.check_call(nuitka_cmd)
|
|||
|
|
print("\n打包成功!")
|
|||
|
|
print(f"请在 dist2/runDecoder.dist 目录下运行 exe 进行测试。")
|
|||
|
|
|
|||
|
|
except subprocess.CalledProcessError as e:
|
|||
|
|
print(f"打包失败,错误码: {e.returncode}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
build()
|