78 lines
2.4 KiB
Bash
78 lines
2.4 KiB
Bash
#!/usr/bin/env bash
|
|
# 共用:解析可用 Python(必须 3.10+ 且带 SSL,跳过宝塔坏环境)
|
|
_py_ok() {
|
|
local py="$1"
|
|
[ -n "$py" ] && [ -x "$py" ] || return 1
|
|
"$py" -c "import sys, ssl; sys.exit(0 if sys.version_info>=(3,10) else 1)" 2>/dev/null
|
|
}
|
|
|
|
resolve_python() {
|
|
local backend="${1:?}"
|
|
local root="${2:-$(cd "$backend/.." && pwd)}"
|
|
local py="" candidate ver_dir
|
|
|
|
# 不 source 宝塔环境,避免 PATH 被坏 Python 污染
|
|
local -a candidates=()
|
|
|
|
candidates+=("$backend/.venv/bin/python")
|
|
candidates+=("/usr/local/python3.11/bin/python3.11")
|
|
candidates+=("/usr/local/python3.10/bin/python3.10")
|
|
candidates+=("/usr/bin/python3.11")
|
|
candidates+=("/usr/bin/python3.10")
|
|
candidates+=("/usr/local/bin/python3.11")
|
|
candidates+=("/usr/local/bin/python3.10")
|
|
|
|
# 动态扫描宝塔 Python(不写死版本号)
|
|
for base in \
|
|
/home/www/server/pyporject_evn/versions \
|
|
/www/server/pyporject_evn/versions \
|
|
/www/server/panel/pyenv/versions; do
|
|
[ -d "$base" ] || continue
|
|
for ver_dir in $(ls -d "$base"/* 2>/dev/null | sort -V -r); do
|
|
for name in python3.11 python3.10 python3 python; do
|
|
candidates+=("$ver_dir/bin/$name")
|
|
done
|
|
done
|
|
done
|
|
|
|
candidates+=("$(command -v python3.11 2>/dev/null || true)")
|
|
candidates+=("$(command -v python3.10 2>/dev/null || true)")
|
|
candidates+=("$(command -v python3 2>/dev/null || true)")
|
|
candidates+=("$(command -v python 2>/dev/null || true)")
|
|
|
|
declare -A seen=()
|
|
for candidate in "${candidates[@]}"; do
|
|
[ -n "$candidate" ] || continue
|
|
[ -n "${seen[$candidate]:-}" ] && continue
|
|
seen[$candidate]=1
|
|
if _py_ok "$candidate"; then
|
|
py="$candidate"
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ -z "$py" ]; then
|
|
echo "[错误] 未找到带 SSL 的 Python 3.10+。" >&2
|
|
echo " 宝塔当前 Python 缺 _ssl,请执行:" >&2
|
|
echo " AUTO_BUILD_PYTHON=1 bash $root/install.sh" >&2
|
|
echo " 然后: KEFU_PYTHON=/usr/local/python3.11/bin/python3.11 bash $backend/baota_fix.sh" >&2
|
|
return 1
|
|
fi
|
|
echo "$py"
|
|
}
|
|
|
|
ensure_uvicorn() {
|
|
local py="${1:?}"
|
|
local backend="${2:?}"
|
|
if "$py" -c "import uvicorn" 2>/dev/null; then
|
|
return 0
|
|
fi
|
|
if ! "$py" -c "import ssl" 2>/dev/null; then
|
|
echo "[错误] $py 无 SSL,无法 pip install" >&2
|
|
return 1
|
|
fi
|
|
echo "[修复] 正在安装 Python 依赖..." >&2
|
|
"$py" -m pip install -U pip -q
|
|
"$py" -m pip install -r "$backend/requirements.txt"
|
|
}
|