#!/bin/bash # # Linux 存储管理器 - PyInstaller 打包脚本 # 自动安装依赖并打包应用程序 # set -e echo "" echo "╔══════════════════════════════════════════════════════════════╗" echo "║ Linux 存储管理器 - PyInstaller 打包工具 ║" echo "╚══════════════════════════════════════════════════════════════╝" echo "" # 检查 Python3 if ! command -v python3 &> /dev/null; then echo "✗ 错误: 未找到 python3" echo " 请先安装 Python 3.6+" exit 1 fi PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') echo " Python 版本: $PYTHON_VERSION" # 检查主程序文件 if [ ! -f "mainwindow_tkinter.py" ] && [ ! -f "mainwindow.py" ]; then echo "✗ 错误: 未找到主程序文件" echo " 请确保在包含 mainwindow_tkinter.py 或 mainwindow.py 的目录中运行此脚本" exit 1 fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " 步骤 1/4: 安装依赖包" echo "═══════════════════════════════════════════════════════════════" # 检测是否为外部管理环境 (PEP 668) IS_EXTERNALLY_MANAGED=0 if python3 -c "import sys; sys.exit(0 if (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix) or 'VIRTUAL_ENV' in __import__('os').environ else 1)" 2>/dev/null; then echo " 检测到在虚拟环境中" IS_EXTERNALLY_MANAGED=0 elif python3 -c "import sysconfig; import os; print(os.path.exists(os.path.join(sysconfig.get_path('stdlib'), 'EXTERNALLY-MANAGED')))" | grep -q "True"; then echo " 检测到外部管理环境 (PEP 668)" IS_EXTERNALLY_MANAGED=1 fi # 安装依赖 install_deps() { local EXTRA_ARGS="" if [ "$IS_EXTERNALLY_MANAGED" -eq 1 ]; then EXTRA_ARGS="--break-system-packages" echo " 使用 --break-system-packages 选项" fi # 安装/升级 pip python3 -m pip install --upgrade pip $EXTRA_ARGS 2>/dev/null || { echo " pip 升级失败,继续安装..." } # 安装 pyinstaller 和 pexpect pip3 install pyinstaller pexpect $EXTRA_ARGS || { return 1 } return 0 } if ! install_deps; then echo " 尝试使用 sudo 安装依赖..." sudo pip3 install pyinstaller pexpect --break-system-packages 2>/dev/null || { echo "" echo "✗ 依赖安装失败" echo "" echo " 您可以选择以下方式安装:" echo "" echo " 方式 1 - 创建虚拟环境 (推荐):" echo " python3 -m venv venv" echo " source venv/bin/activate" echo " pip install pyinstaller pexpect" echo " ./build.sh" echo "" echo " 方式 2 - 使用系统包管理器 (Arch):" echo " sudo pacman -S python-pyinstaller python-pexpect" echo " ./build.sh" echo "" echo " 方式 3 - 强制安装 (有风险):" echo " pip3 install pyinstaller pexpect --break-system-packages" echo " ./build.sh" echo "" exit 1 } fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " 步骤 2/4: 清理构建文件" echo "═══════════════════════════════════════════════════════════════" # 清理旧文件 rm -rf build dist __pycache__ rm -f mainwindow*.spec echo " 已清理构建文件" echo "" echo "═══════════════════════════════════════════════════════════════" echo " 步骤 3/4: PyInstaller 打包" echo "═══════════════════════════════════════════════════════════════" # 确定主文件 MAIN_SCRIPT="mainwindow_tkinter.py" if [ ! -f "$MAIN_SCRIPT" ]; then MAIN_SCRIPT="mainwindow.py" fi echo " 打包文件: $MAIN_SCRIPT" # 执行打包 python3 -m PyInstaller \ --onefile \ --name "linux-storage-manager" \ --clean \ --noconfirm \ --console \ "$MAIN_SCRIPT" echo "" echo "═══════════════════════════════════════════════════════════════" echo " 步骤 4/4: 创建桌面快捷方式" echo "═══════════════════════════════════════════════════════════════" cat > linux-storage-manager.desktop << 'EOF' [Desktop Entry] Name=Linux 存储管理器 Comment=Linux 存储管理工具 Exec=/usr/local/bin/linux-storage-manager Icon=drive-harddisk Terminal=false Type=Application Categories=System;Utility; Keywords=storage;disk;partition;raid;lvm; EOF echo " 已创建桌面文件: linux-storage-manager.desktop" echo " 安装命令: sudo cp linux-storage-manager.desktop /usr/share/applications/" # 检查输出 if [ -f "dist/linux-storage-manager" ]; then SIZE=$(du -h dist/linux-storage-manager | cut -f1) echo "" echo "╔══════════════════════════════════════════════════════════════╗" echo "║ 打包成功! ║" echo "╚══════════════════════════════════════════════════════════════╝" echo "" echo " 输出文件: dist/linux-storage-manager" echo " 文件大小: $SIZE" echo "" echo " 使用方法:" echo " 直接运行: sudo dist/linux-storage-manager" echo " 安装到系统: sudo cp dist/linux-storage-manager /usr/local/bin/" echo "" else echo "✗ 打包失败: 未找到输出文件" exit 1 fi