#!/bin/bash # # Linux 存储管理器 - PyInstaller 打包脚本 (简化版) # 直接打包,仅保留 dist 目录中的最终文件 # set -e # 确定主文件 MAIN_SCRIPT="mainwindow_tkinter.py" if [ ! -f "$MAIN_SCRIPT" ]; then MAIN_SCRIPT="mainwindow.py" fi # 检查 tkinter if ! python3 -c "import tkinter" 2>/dev/null; then echo "错误: 未找到 tkinter 模块" exit 1 fi # 获取 tkinter 路径 TKINTER_INFO=$(python3 << 'EOF' import tkinter import os import sys tcl = tkinter.Tcl() tk_version = tcl.call("info", "tclversion") tk_lib = tcl.call("info", "library") print(f"TK_VERSION:{tk_version}") print(f"TK_LIBRARY:{tk_lib}") tkinter_file = tkinter.__file__ print(f"TKINTER_FILE:{tkinter_file}") tcl_lib = os.path.dirname(tk_lib) print(f"TCL_LIBRARY:{tcl_lib}") import sysconfig lib_dynload = os.path.join(sysconfig.get_config_var('LIBDIR'), f"python{sys.version_info.major}.{sys.version_info.minor}", "lib-dynload") if not os.path.exists(lib_dynload): lib_dynload = os.path.join(sysconfig.get_config_var('LIBDIR'), "lib-dynload") print(f"LIB_DYNLOAD:{lib_dynload}") EOF ) TK_VERSION=$(echo "$TKINTER_INFO" | grep "TK_VERSION:" | cut -d: -f2) TK_LIBRARY=$(echo "$TKINTER_INFO" | grep "TK_LIBRARY:" | cut -d: -f2) TCL_LIBRARY=$(echo "$TKINTER_INFO" | grep "TCL_LIBRARY:" | cut -d: -f2) LIB_DYNLOAD=$(echo "$TKINTER_INFO" | grep "LIB_DYNLOAD:" | cut -d: -f2) PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') # 查找 _tkinter 共享库 TKINTER_SO="" for pattern in "_tkinter.cpython-${PYTHON_VERSION//./}m-x86_64-linux-gnu.so" "_tkinter.cpython-${PYTHON_VERSION//./}-x86_64-linux-gnu.so" "_tkinter.so"; do if [ -f "$LIB_DYNLOAD/$pattern" ]; then TKINTER_SO="$LIB_DYNLOAD/$pattern" break fi done if [ -z "$TKINTER_SO" ]; then TKINTER_SO=$(find $LIB_DYNLOAD -name "_tkinter*.so" 2>/dev/null | head -1) fi # 构建 PyInstaller 参数 PYINSTALLER_ARGS=( --onefile --name "linux-storage-manager" --clean --noconfirm --console --hidden-import "tkinter" --hidden-import "tkinter.ttk" --hidden-import "tkinter.scrolledtext" --hidden-import "tkinter.messagebox" --hidden-import "tkinter.filedialog" --hidden-import "tkinter.simpledialog" --hidden-import "_tkinter" ) # 添加 tkinter 库文件 if [ -n "$TKINTER_SO" ]; then PYINSTALLER_ARGS+=(--add-binary "$TKINTER_SO:.") fi if [ -d "$TCL_LIBRARY" ]; then PYINSTALLER_ARGS+=(--add-data "$TCL_LIBRARY:tcl") fi if [ -d "$TK_LIBRARY" ]; then PYINSTALLER_ARGS+=(--add-data "$TK_LIBRARY:tk") fi # 查找并添加其他 Tcl/Tk 文件 for dir in /usr/lib64/tcl$TK_VERSION /usr/lib/tcl$TK_VERSION /usr/share/tcltk /usr/lib/tcltk /usr/lib64/tcltk; do if [ -d "$dir" ]; then PYINSTALLER_ARGS+=(--add-data "$dir:tcltk") fi done # 执行打包 python3 -m PyInstaller "${PYINSTALLER_ARGS[@]}" "$MAIN_SCRIPT" # 检查结果 if [ -f "dist/linux-storage-manager" ]; then SIZE=$(du -h dist/linux-storage-manager | cut -f1) echo "" echo "打包成功!" echo " 输出文件: dist/linux-storage-manager" echo " 文件大小: $SIZE" echo " 运行命令: sudo dist/linux-storage-manager" else echo "打包失败" exit 1 fi