Files
dy/backend/lib/resolve_python.sh
T
2026-07-23 17:56:25 +08:00

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"
}