#!/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" }