集成 venv 方案: 安装脚本 + 服务文件适配虚拟环境
- install.sh: 创建 .venv、安装 adbutils、生成包装脚本使用 venv python - padsleep.service: ExecStart 指向 .venv/bin/python3 - requirements.txt: 添加 venv 安装说明 - 解决 PEP 668 (externally-managed-environment) 问题
This commit is contained in:
+39
-9
@@ -3,6 +3,7 @@
|
|||||||
# 用法: sudo ./install.sh
|
# 用法: sudo ./install.sh
|
||||||
#
|
#
|
||||||
# 将程序安装到 /opt/apps/padsleep,创建命令行软链接。
|
# 将程序安装到 /opt/apps/padsleep,创建命令行软链接。
|
||||||
|
# 自动创建 Python 虚拟环境并安装依赖。
|
||||||
# 代码中 SCRIPT_DIR 使用 Path(__file__).resolve().parent,
|
# 代码中 SCRIPT_DIR 使用 Path(__file__).resolve().parent,
|
||||||
# 会自动适配安装路径,无需修改代码。
|
# 会自动适配安装路径,无需修改代码。
|
||||||
|
|
||||||
@@ -11,6 +12,8 @@ set -e
|
|||||||
INSTALL_DIR="/opt/apps/padsleep"
|
INSTALL_DIR="/opt/apps/padsleep"
|
||||||
BIN_DIR="/usr/local/bin"
|
BIN_DIR="/usr/local/bin"
|
||||||
SERVICE_DIR="/etc/systemd/system"
|
SERVICE_DIR="/etc/systemd/system"
|
||||||
|
VENV_DIR="$INSTALL_DIR/.venv"
|
||||||
|
PYTHON_BIN="$VENV_DIR/bin/python3"
|
||||||
|
|
||||||
# 颜色
|
# 颜色
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
@@ -40,7 +43,6 @@ fi
|
|||||||
# ── 确定运行用户(sudo 的原用户)──
|
# ── 确定运行用户(sudo 的原用户)──
|
||||||
RUN_USER="${SUDO_USER:-}"
|
RUN_USER="${SUDO_USER:-}"
|
||||||
if [ -z "$RUN_USER" ]; then
|
if [ -z "$RUN_USER" ]; then
|
||||||
# fallback: 从服务文件提取 User= 字段
|
|
||||||
if [ -f "$SRC_DIR/padsleep.service" ]; then
|
if [ -f "$SRC_DIR/padsleep.service" ]; then
|
||||||
RUN_USER=$(grep '^User=' "$SRC_DIR/padsleep.service" | head -1 | cut -d= -f2)
|
RUN_USER=$(grep '^User=' "$SRC_DIR/padsleep.service" | head -1 | cut -d= -f2)
|
||||||
fi
|
fi
|
||||||
@@ -75,6 +77,25 @@ fi
|
|||||||
touch "$INSTALL_DIR/padsleep.log"
|
touch "$INSTALL_DIR/padsleep.log"
|
||||||
chmod 644 "$INSTALL_DIR/padsleep.log"
|
chmod 644 "$INSTALL_DIR/padsleep.log"
|
||||||
|
|
||||||
|
# ── 创建 Python 虚拟环境 ──
|
||||||
|
if [ ! -d "$VENV_DIR" ]; then
|
||||||
|
info "正在创建 Python 虚拟环境..."
|
||||||
|
python3 -m venv "$VENV_DIR"
|
||||||
|
info "虚拟环境已创建: $VENV_DIR"
|
||||||
|
else
|
||||||
|
info "虚拟环境已存在,跳过创建"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── 安装 Python 依赖 ──
|
||||||
|
info "正在安装 Python 依赖..."
|
||||||
|
"$VENV_DIR/bin/pip" install --quiet adbutils 2>&1 || {
|
||||||
|
warn "pip 安装失败,尝试离线安装..."
|
||||||
|
if [ -f "$SRC_DIR/.venv" ]; then
|
||||||
|
cp -r "$SRC_DIR/.venv" "$VENV_DIR"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
info "Python 依赖安装完成"
|
||||||
|
|
||||||
# 设置执行权限
|
# 设置执行权限
|
||||||
chmod 755 "$INSTALL_DIR/padsleep.py"
|
chmod 755 "$INSTALL_DIR/padsleep.py"
|
||||||
chmod 755 "$INSTALL_DIR/padsleep_tui.py"
|
chmod 755 "$INSTALL_DIR/padsleep_tui.py"
|
||||||
@@ -85,19 +106,28 @@ chmod 755 "$INSTALL_DIR"
|
|||||||
chmod 644 "$INSTALL_DIR/padsleep.log" 2>/dev/null
|
chmod 644 "$INSTALL_DIR/padsleep.log" 2>/dev/null
|
||||||
info "文件所有权已设置为 $RUN_USER"
|
info "文件所有权已设置为 $RUN_USER"
|
||||||
|
|
||||||
# ── 创建软链接 ──
|
# ── 创建命令包装脚本(使用 venv Python)──
|
||||||
ln -sf "$INSTALL_DIR/padsleep.py" "$BIN_DIR/padsleep"
|
create_wrapper() {
|
||||||
ln -sf "$INSTALL_DIR/padsleep_tui.py" "$BIN_DIR/padsleep-config"
|
local script="$1" # padsleep.py 或 padsleep_tui.py
|
||||||
info "已创建命令软链接:"
|
local link="$2" # /usr/local/bin/padsleep
|
||||||
info " $BIN_DIR/padsleep → 启动守护进程"
|
cat > "$link" <<WRAPPER
|
||||||
info " $BIN_DIR/padsleep-config → 启动 TUI 配置工具"
|
#!/bin/bash
|
||||||
|
exec "$PYTHON_BIN" "$INSTALL_DIR/$script" "\$@"
|
||||||
|
WRAPPER
|
||||||
|
chmod 755 "$link"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_wrapper "padsleep.py" "$BIN_DIR/padsleep"
|
||||||
|
create_wrapper "padsleep_tui.py" "$BIN_DIR/padsleep-config"
|
||||||
|
info "已创建命令入口:"
|
||||||
|
info " $BIN_DIR/padsleep → 启动守护进程 ($PYTHON_BIN)"
|
||||||
|
info " $BIN_DIR/padsleep-config → 启动 TUI 配置工具 ($PYTHON_BIN)"
|
||||||
|
|
||||||
# ── 可选:复制 systemd 服务 ──
|
# ── 可选:复制 systemd 服务 ──
|
||||||
if [ -f "$SRC_DIR/padsleep.service" ]; then
|
if [ -f "$SRC_DIR/padsleep.service" ]; then
|
||||||
# 复制并更新服务文件中的路径和用户
|
|
||||||
cp "$SRC_DIR/padsleep.service" "$SERVICE_DIR/padsleep.service"
|
cp "$SRC_DIR/padsleep.service" "$SERVICE_DIR/padsleep.service"
|
||||||
sed -i "s|WorkingDirectory=.*|WorkingDirectory=$INSTALL_DIR|" "$SERVICE_DIR/padsleep.service"
|
sed -i "s|WorkingDirectory=.*|WorkingDirectory=$INSTALL_DIR|" "$SERVICE_DIR/padsleep.service"
|
||||||
sed -i "s|ExecStart=.*|ExecStart=/usr/bin/python3 $INSTALL_DIR/padsleep.py|" "$SERVICE_DIR/padsleep.service"
|
sed -i "s|ExecStart=.*|ExecStart=$PYTHON_BIN $INSTALL_DIR/padsleep.py|" "$SERVICE_DIR/padsleep.service"
|
||||||
sed -i "s|^User=.*|User=$RUN_USER|" "$SERVICE_DIR/padsleep.service"
|
sed -i "s|^User=.*|User=$RUN_USER|" "$SERVICE_DIR/padsleep.service"
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
info "已复制 systemd 服务文件: $SERVICE_DIR/padsleep.service"
|
info "已复制 systemd 服务文件: $SERVICE_DIR/padsleep.service"
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ After=network.target
|
|||||||
Type=simple
|
Type=simple
|
||||||
User=_INSTALL_USER_
|
User=_INSTALL_USER_
|
||||||
WorkingDirectory=/opt/apps/padsleep
|
WorkingDirectory=/opt/apps/padsleep
|
||||||
ExecStart=/usr/bin/python3 /opt/apps/padsleep/padsleep.py
|
ExecStart=/opt/apps/padsleep/.venv/bin/python3 /opt/apps/padsleep/padsleep.py
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=10
|
RestartSec=10
|
||||||
StandardOutput=journal
|
StandardOutput=journal
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
# padsleep_adb 依赖
|
# padsleep_adb 依赖
|
||||||
|
# 安装方式(在项目目录下):
|
||||||
|
# python3 -m venv .venv
|
||||||
|
# .venv/bin/pip install -r requirements.txt
|
||||||
|
|
||||||
adbutils>=2.12.0
|
adbutils>=2.12.0
|
||||||
|
|
||||||
# 系统依赖:adb (Android Debug Bridge)
|
# 系统依赖:adb (Android Debug Bridge)
|
||||||
|
|||||||
Reference in New Issue
Block a user