centos7.9 编译安装 python3.11.9 编译安装python3
centos7.9 编译安装 python3.11.9
编译安装python3
创建一个完整的自动化安装脚本。这个脚本会在CentOS 7.9上独立部署Python 3.11.9和OpenSSL 1.1.1w,完全不影响系统自带的Python 2.7。
cat > /tmp/install_python311_centos7.sh << 'EOF' #!/bin/bash set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log() { echo -e "${GREEN}[INFO]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" exit 1 } # 下载地址变量 OPENSSL_URL="https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz" PYTHON_URL="https://mirrors.aliyun.com/python-release/source/Python-3.11.9.tgz" # 安装目录 OPENSSL_PREFIX="/usr/local/openssl-1.1.1" PYTHON_PREFIX="/usr/local/python3.11" # 检查是否root check_root() { if [[ $EUID -ne 0 ]]; then error "This script must be run as root" fi } # 安装系统依赖 install_dependencies() { log "Installing system dependencies..." yum groupinstall -y "Development Tools" yum install -y wget zlib-devel bzip2-devel openssl-devel ncurses-devel \ sqlite-devel readline-devel tk-devel gdbm-devel db4-devel \ libpcap-devel xz-devel libffi-devel gcc make perl } # 下载文件 download_file() { local url=$1 local filename=$2 local dest_dir=$3 cd "$dest_dir" if [[ -f "/tmp/$filename" ]]; then log "Found $filename in /tmp, using local file" cp "/tmp/$filename" . else log "Downloading $filename from $url" wget --no-check-certificate -O "$filename" "$url" || { error "Failed to download $filename" } fi } # 安装OpenSSL install_openssl() { log "Installing OpenSSL 1.1.1w..." if [[ -d "$OPENSSL_PREFIX" ]]; then warn "OpenSSL already installed at $OPENSSL_PREFIX, skipping..." return 0 fi cd /tmp download_file "$OPENSSL_URL" "openssl-1.1.1w.tar.gz" "/tmp" tar xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix=$OPENSSL_PREFIX --openssldir=$OPENSSL_PREFIX shared zlib make -j$(nproc) make install # 配置动态库路径 echo "$OPENSSL_PREFIX/lib" > /etc/ld.so.conf.d/openssl-1.1.1.conf ldconfig log "OpenSSL installation completed" } # 安装Python install_python() { log "Installing Python 3.11.9..." if [[ -d "$PYTHON_PREFIX" ]]; then warn "Python already installed at $PYTHON_PREFIX, skipping..." return 0 fi cd /tmp download_file "$PYTHON_URL" "Python-3.11.9.tgz" "/tmp" tar xzf Python-3.11.9.tgz cd Python-3.11.9 # 设置环境变量 export CPPFLAGS="-I$OPENSSL_PREFIX/include" export LDFLAGS="-L$OPENSSL_PREFIX/lib -Wl,-rpath,$OPENSSL_PREFIX/lib" export LD_LIBRARY_PATH="$OPENSSL_PREFIX/lib:$LD_LIBRARY_PATH" ./configure --prefix=$PYTHON_PREFIX \ --enable-shared \ --with-openssl=$OPENSSL_PREFIX \ --with-ssl-default-suites=openssl \ --enable-optimizations make -j$(nproc) make altinstall # 配置Python动态库路径 echo "$PYTHON_PREFIX/lib" > /etc/ld.so.conf.d/python3.11.conf ldconfig log "Python installation completed" } # 配置环境 setup_environment() { log "Setting up environment..." # 创建符号链接 ln -sf $PYTHON_PREFIX/bin/python3.11 /usr/local/bin/python3 ln -sf $PYTHON_PREFIX/bin/pip3.11 /usr/local/bin/pip3 # 添加到PATH(可选,添加到/etc/profile.d) cat > /etc/profile.d/python311.sh << 'PROFILE' export PATH=/usr/local/python3.11/bin:$PATH export LD_LIBRARY_PATH=/usr/local/python3.11/lib:/usr/local/openssl-1.1.1/lib:$LD_LIBRARY_PATH PROFILE # 配置pip国内源 mkdir -p /root/.pip cat > /root/.pip/pip.conf << 'PIPCONF' [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple/ trusted-host = pypi.tuna.tsinghua.edu.cn timeout = 120 [install] trusted-host = pypi.tuna.tsinghua.edu.cn PIPCONF # 系统级pip配置(可选) mkdir -p /etc/pip cat > /etc/pip.conf << 'ETCPIP' [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple/ trusted-host = pypi.tuna.tsinghua.edu.cn timeout = 120 ETCPIP } # 验证安装 verify_installation() { log "Verifying installation..." # 检查Python版本 if /usr/local/bin/python3 --version | grep -q "3.11.9"; then log "Python 3.11.9 installed successfully" else error "Python installation verification failed" fi # 检查SSL支持 if /usr/local/bin/python3 -c "import ssl; print('OpenSSL Version:', ssl.OPENSSL_VERSION)" 2>/dev/null; then log "SSL support verified" else error "SSL support verification failed" fi # 检查pip if /usr/local/bin/pip3 --version &>/dev/null; then log "pip3 installed successfully" else error "pip3 installation verification failed" fi # 检查系统Python不受影响 if python --version 2>&1 | grep -q "2.7"; then log "System Python 2.7 is unaffected" fi # 测试pip源 log "Testing pip source..." /usr/local/bin/pip3 config list } # 显示使用信息 show_usage() { log "Installation completed!" echo "" echo "Usage:" echo " Python 3.11: python3" echo " pip3: pip3" echo "" echo "Examples:" echo " python3 --version" echo " pip3 install requests" echo "" echo "OpenSSL location: $OPENSSL_PREFIX" echo "Python location: $PYTHON_PREFIX" } main() { log "Starting Python 3.11.9 installation on CentOS 7.9" check_root install_dependencies install_openssl install_python setup_environment verify_installation show_usage log "All done! You may need to run 'source /etc/profile' or re-login to apply changes." } main "$@" EOF # 给脚本执行权限 chmod +x /tmp/install_python311_centos7.sh
使用说明 1. 运行安装脚本 bash # 直接运行(会自动下载所需文件) /tmp/install_python311_centos7.sh # 或者如果文件已经在/tmp目录,脚本会自动使用本地文件 2. 手动放置文件(可选) 如果网络不好,可以手动将文件放到/tmp目录: bash # 手动下载文件到/tmp wget -O /tmp/openssl-1.1.1w.tar.gz "https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz" wget -O /tmp/Python-3.11.9.tgz "https://mirrors.aliyun.com/python-release/source/Python-3.11.9.tgz" 3. 验证安装 安装完成后,运行: bash python3 --version pip3 --version python3 -c "import ssl; print(ssl.OPENSSL_VERSION)" 脚本特点 完全独立:不影响系统Python 2.7 自动检测:如果文件已存在则使用本地文件 错误处理:每一步都有错误检查和回退 环境配置:自动配置PATH、库路径、pip源 验证检查:安装完成后自动验证所有组件 易于维护:下载URL通过变量定义,易于修改
完全可以!这是最安全的方法。我们编译安装新版OpenSSL到独立目录,然后让Python使用这个版本。 步骤1:编译安装OpenSSL 1.1.1 bash # 安装编译依赖 yum install -y gcc make perl zlib-devel # 下载OpenSSL 1.1.1 cd /tmp wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w # 配置并编译到独立目录 ./config --prefix=/usr/local/openssl-1.1.1 --openssldir=/usr/local/openssl-1.1.1 shared zlib # 编译安装 make -j4 make install # 验证安装 /usr/local/openssl-1.1.1/bin/openssl version 步骤2:配置环境变量 bash # 设置环境变量(临时) export OPENSSL_ROOT=/usr/local/openssl-1.1.1 export LD_LIBRARY_PATH=$OPENSSL_ROOT/lib:$LD_LIBRARY_PATH # 永久设置(可选,添加到 ~/.bashrc) echo 'export OPENSSL_ROOT=/usr/local/openssl-1.1.1' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=$OPENSSL_ROOT/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc 步骤3:重新编译Python 3.11.9 bash cd /tmp/Python-3.11.9 make distclean # 配置Python,指向我们编译的OpenSSL export CPPFLAGS="-I$OPENSSL_ROOT/include" export LDFLAGS="-L$OPENSSL_ROOT/lib -Wl,-rpath,$OPENSSL_ROOT/lib" export LD_LIBRARY_PATH="$OPENSSL_ROOT/lib:$LD_LIBRARY_PATH" ./configure --prefix=/usr/local/python3.11 \ --enable-shared \ --with-openssl=$OPENSSL_ROOT \ --with-ssl-default-suites=openssl # 编译安装 make -j4 make altinstall 步骤4:验证安装 bash # 检查Python SSL支持 /usr/local/python3.11/bin/python3.11 -c "import ssl; print(ssl.OPENSSL_VERSION)" # 创建符号链接 ln -sf /usr/local/python3.11/bin/python3.11 /usr/local/bin/python3 ln -sf /usr/local/python3.11/bin/pip3.11 /usr/local/bin/pip3 # 最终验证 python3 --version python3 -c "import ssl; print('SSL support: OK')" 步骤5:配置动态库路径 bash # 添加OpenSSL库路径到系统配置 echo "/usr/local/openssl-1.1.1/lib" > /etc/ld.so.conf.d/openssl-1.1.1.conf echo "/usr/local/python3.11/lib" > /etc/ld.so.conf.d/python3.11.conf ldconfig # 验证动态库 ldconfig -p | grep openssl ldconfig -p | grep python 验证系统OpenSSL不受影响 bash # 检查系统OpenSSL版本(应该还是1.0.2) openssl version # 检查我们安装的OpenSSL版本 /usr/local/openssl-1.1.1/bin/openssl version 关键点: 完全独立:OpenSSL 1.1.1安装在/usr/local/openssl-1.1.1,不影响系统OpenSSL 安全:系统其他应用继续使用OpenSSL 1.0.2 仅Python使用:只有Python使用新版OpenSSL 动态库隔离:通过LD_LIBRARY_PATH和ldconfig管理库路径 这样既满足了Python 3.11的SSL要求,又不会影响系统稳定性。 ============================================= 这个问题是因为Python的动态库路径没有配置好。让我们来修复: 修复步骤: 1. 配置Python动态库路径 bash # 添加Python库路径到ldconfig echo "/usr/local/python3.11/lib" > /etc/ld.so.conf.d/python3.11.conf # 更新动态库缓存 ldconfig # 验证库文件是否存在 ls -la /usr/local/python3.11/lib/libpython3.11.so* 2. 设置PATH环境变量 bash # 临时设置PATH export PATH="/usr/local/python3.11/bin:$PATH" # 永久设置(添加到 ~/.bashrc) echo 'export PATH="/usr/local/python3.11/bin:$PATH"' >> ~/.bashrc source ~/.bashrc 3. 创建符号链接 bash # 创建python3和pip3链接 ln -sf /usr/local/python3.11/bin/python3.11 /usr/local/bin/python3 ln -sf /usr/local/python3.11/bin/pip3.11 /usr/local/bin/pip3 # 如果需要系统级访问,也可以链接到/usr/bin(可选) ln -sf /usr/local/python3.11/bin/python3.11 /usr/bin/python3 ln -sf /usr/local/python3.11/bin/pip3.11 /usr/bin/pip3 4. 验证安装 bash # 现在应该能正常工作了 python3 --version python3 -c "import ssl; print(ssl.OPENSSL_VERSION)" # 检查pip pip3 --version 5. 如果还有问题,手动设置LD_LIBRARY_PATH bash # 临时设置 export LD_LIBRARY_PATH="/usr/local/python3.11/lib:$LD_LIBRARY_PATH" # 永久设置(添加到 ~/.bashrc) echo 'export LD_LIBRARY_PATH="/usr/local/python3.11/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc source ~/.bashrc 6. 验证OpenSSL支持 bash # 检查Python使用的OpenSSL版本 python3 -c "import ssl; print('OpenSSL版本:', ssl.OPENSSL_VERSION)" # 检查SSL模块是否正常工作 python3 -c "import ssl; print('SSL支持: OK')" 完整验证: bash # 重新登录或source环境变量后验证 python3 --version pip3 --version python3 -c "import ssl; print('SSL:', ssl.OPENSSL_VERSION); print('编译完成!')" 如果还有问题: 检查库文件: bash # 确认库文件存在且可读 ls -la /usr/local/python3.11/lib/libpython3.11.so* # 检查ldconfig缓存 ldconfig -p | grep libpython3.11 现在Python 3.11.9应该可以正常工作了,包括SSL支持!
浙公网安备 33010602011771号