114 lines
3.2 KiB
Bash
114 lines
3.2 KiB
Bash
#!/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
|