1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #!/bin/bash
set -euo pipefail
if [ $# -lt 1 ] || [ $# -gt 2 ]; then echo "错误:参数数量不正确" echo "用法:$0 <python_version> [安装目录]" echo "示例:$0 3.8.12 /opt/python3.8" exit 1 fi
START_TIME=$(date +"%Y.%m.%d %H:%M:%S")
VERSION="$1" INSTALL_DIR="${2:-/usr/local/python${VERSION}}" LOG_FILE="$PWD/python_${VERSION}_install.log" PYTHON_URL="https://www.python.org/ftp/python/${VERSION}/Python-${VERSION}.tar.xz" TAR_FILE="Python-${VERSION}.tar.xz" SOURCE_DIR="Python-${VERSION}"
if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "错误:无效的版本号格式 '$VERSION',格式应为 3.8.12" | tee -a "$LOG_FILE" exit 1 fi
echo "=== 开始安装 Python $VERSION 到 ${INSTALL_DIR} [${START_TIME}] ===" | tee -a "$LOG_FILE" echo "完整日志记录到:$(pwd)/${LOG_FILE}" | tee -a "$LOG_FILE"
execute_step() { local step_name="$1" local command="$2" echo -e "\n[$(date +'%Y.%m.%d %H:%M:%S')] $step_name" | tee -a "$LOG_FILE" echo "命令: $command" | tee -a "$LOG_FILE" eval "$command" 2>&1 | tee -a "$LOG_FILE" local status=$? if [ $status -ne 0 ]; then echo -e "\n[$(date +'%Y.%m.%d %H:%M:%S')] 错误:步骤 '$step_name' 失败,状态码 $status" | tee -a "$LOG_FILE" exit $status fi }
install_build_deps() { if command -v apt-get >/dev/null 2>&1; then echo -e "\n[$(date +'%Y.%m.%d %H:%M:%S')] === 检测到APT包管理器 ===" | tee -a "$LOG_FILE" execute_step "更新软件源" "sudo apt update -y" execute_step "安装编译工具链" "sudo apt install -y build-essential checkinstall libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libbz2-dev libffi-dev zlib1g-dev" elif command -v yum >/dev/null 2>&1; then echo -e "\n[$(date +'%Y.%m.%d %H:%M:%S')] === 检测到YUM包管理器 ===" | tee -a "$LOG_FILE" execute_step "安装开发工具组" "sudo yum groupinstall -y 'Development Tools'" execute_step "安装额外依赖" "sudo yum install -y python3-devel openssl-devel bzip2-devel libffi-devel sqlite-devel zlib-devel" else echo -e "\n[$(date +'%Y.%m.%d %H:%M:%S')] 错误:不支持的包管理器" | tee -a "$LOG_FILE" exit 1 fi }
install_build_deps execute_step "创建安装目录" "mkdir -p '$INSTALL_DIR'" execute_step "下载源码" "wget --no-check-certificate -O '$TAR_FILE' '$PYTHON_URL' || (rm -f '$TAR_FILE' && exit 1)" execute_step "解压源码" "rm -rf '$SOURCE_DIR' && tar -xf '$TAR_FILE'" cd "$SOURCE_DIR" || (echo "[$(date +'%Y.%m.%d %H:%M:%S')] 无法进入目录 $SOURCE_DIR" | tee -a "$LOG_FILE"; exit 1)
execute_step "配置" "./configure --prefix='$INSTALL_DIR' --enable-optimizations" execute_step "编译" "make -j$(nproc)" execute_step "安装" "make altinstall"
echo -e "\n[$(date +'%Y.%m.%d %H:%M:%S')] === Python $VERSION 安装成功 ===" | tee -a "$LOG_FILE" echo "安装路径: $INSTALL_DIR/bin/python${VERSION%.*}" echo "请将以下内容添加到 ~/.bashrc 或 ~/.zshrc:" echo "export PATH=\"$INSTALL_DIR/bin:\$PATH\"" exit 0
|