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支持!

 

posted @ 2025-10-17 15:10  闻道者  阅读(3)  评论(0)    收藏  举报