适用系统 :CentOS 7.x
Python 版本 :3.11.4
OpenSSL 版本:1.1.1w
适用场景:内网环境无法联网下载依赖,且目标 Python 版本和编译环境不可控,需要一个开箱即用的便携式 Python 环境来简化项目分发,那么如下的操作可以作为一个参考。
摘要:本文详细记录了在 CentOS 7.x 外网环境中,从零开始编译构建一个包含 OpenSSL 1.1.1w 支持、GCC 9 编译工具链的便携式 Python 3.11.4 运行环境的完整流程。主要内容包括:1) 安装系统基础依赖与开发工具;2) 通过 SCL 仓库升级 GCC 至 9.3.1 以解决版本过低问题;3) 编译安装 OpenSSL 1.1.1w 并配置动态库路径;4) 配置环境变量并编译安装支持 SSL 的 Python 3.11.4;5) 使用 pip 安装常用模块(如 requests, pandas, numpy)并下载离线包;6) 最终将整个环境打包成 tar.gz 文件,便于在内网其他机器上快速部署使用。
一、系统依赖安装
1.1 检查并安装基础依赖
bash
# 检查是否已安装 openssl-devel
rpm -qa | grep openssl-devel
# 如果没有,安装
sudo yum install -y openssl-devel
# 检查头文件
ls /usr/include/openssl/ssl.h
# 应输出:/usr/include/openssl/ssl.h
# 检查库文件
ls /usr/lib64/libssl.so*
# 检查 openssl 版本信息
openssl version
# 更新版本
sudo yum update -y openssl-devel
1.2 安装开发工具及依赖
bash
# 安装开发工具组
sudo yum groupinstall -y "Development Tools"
# 安装编译 Python 所需的所有依赖
sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel \
libffi-devel wget xz-devel tk-devel libffi-devel gdbm-devel db4-devel ncurses-devel
二、GCC 升级(解决版本过低问题)
2.1 检查当前版本
bash
# 查看当前 GCC 版本(CentOS 7 默认为 4.8.5)
gcc --version
2.2 安装 SCL 仓库
bash
# 安装 SCL 仓库
sudo yum install -y centos-release-scl centos-release-scl-rh
2.3 配置仓库镜像(解决 CentOS 7 EOL 问题)
bash
# 进入仓库目录
cd /etc/yum.repos.d/
# 备份原始配置
cp CentOS-SCLo-scl.repo CentOS-SCLo-scl.repo.bak
cp CentOS-SCLo-scl-rh.repo CentOS-SCLo-scl-rh.repo.bak
# 修改为阿里云镜像
sed -i 's|mirror.centos.org|mirrors.aliyun.com|g' CentOS-SCLo-scl.repo
sed -i 's|#baseurl|baseurl|g' CentOS-SCLo-scl.repo
sed -i 's|mirrorlist|#mirrorlist|g' CentOS-SCLo-scl.repo
sed -i 's|mirror.centos.org|mirrors.aliyun.com|g' CentOS-SCLo-scl-rh.repo
sed -i 's|#baseurl|baseurl|g' CentOS-SCLo-scl-rh.repo
sed -i 's|mirrorlist|#mirrorlist|g' CentOS-SCLo-scl-rh.repo
2.4 清理并重建缓存
bash
# 清理旧缓存
yum clean all
# 列出可用仓库(验证配置)
yum repolist
# 重建缓存
yum makecache
2.5 网络诊断(如仓库仍不可访问)
bash
# 测试网络连通性
ping -c 4 www.baidu.com
# 设置 DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
# 安装 bind-utils
yum install -y bind-utils
# DNS 解析测试
nslookup mirror.aliyun.com
dig mirror.aliyun.com
# 测试仓库可访问性
curl -v http://mirror.aliyun.com/centos/7/sclo/x86_64/rh/repodata/repomd.xml
2.6 安装并启用 GCC 9
bash
# 安装 devtoolset-9
sudo yum install -y devtoolset-9
# 启用 GCC 9(进入新 shell)
scl enable devtoolset-9 bash
# 验证版本
gcc --version
# 预期输出:gcc (GCC) 9.3.1
三、OpenSSL 1.1.1 编译(解决 SSL 模块缺失)
3.1 下载并解压
bash
cd /home/tools
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
3.2 编译安装
bash
# 配置编译选项
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
# 编译安装
sudo make install
# 如果编译失败,清理后重试
make clean
3.3 配置动态库路径
bash
# 添加库路径配置
echo '/usr/local/ssl/lib' | sudo tee /etc/ld.so.conf.d/openssl-1.1.1w.conf
# 更新动态链接库缓存
sudo ldconfig
# 验证库文件
ldconfig -p | grep libssl.so.1.1
3.4 替换系统 OpenSSL(可选)
bash
# 创建软链接
sudo ln -sf /usr/local/ssl/bin/openssl /usr/bin/openssl
# 验证版本
/usr/local/ssl/bin/openssl version
四、Python 3.11.4 编译安装
4.1 下载并解压
bash
cd /home/tools
wget https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz
tar -xf Python-3.11.4.tgz
cd Python-3.11.4
4.2 设置 OpenSSL 环境变量
bash
export LDFLAGS="-L/usr/local/ssl/lib -Wl,-rpath,/usr/local/ssl/lib"
export CPPFLAGS="-I/usr/local/ssl/include"
export PKG_CONFIG_PATH="/usr/local/ssl/lib/pkgconfig"
export LD_LIBRARY_PATH="/usr/local/ssl/lib:$LD_LIBRARY_PATH"
4.3 配置编译选项(带 OpenSSL 支持 + 动态库 + 优化)
bash
./configure \
--prefix=/home/tools/python3.11.4 \
--enable-optimizations \
--with-openssl=/usr/local/ssl \
--with-openssl-rpath=auto \
--enable-shared
4.4 编译安装
bash
# 编译(使用所有 CPU 核心)
make -j$(nproc)
# 如果编译失败,清理后重试
make clean
# 安装
make install
4.5 配置 Python 动态库路径
bash
# 添加 Python 库路径
echo '/home/tools/python3.11.4/lib' | sudo tee /etc/ld.so.conf.d/python3.11.conf
# 更新动态链接库缓存
sudo ldconfig
4.6 验证安装
bash
# 验证 SSL 和 hashlib 模块
/home/tools/python3.11.4/bin/python3.11 -c "
import ssl
import hashlib
print('SSL:', ssl.OPENSSL_VERSION)
print('SHA256:', hashlib.sha256(b'hello').hexdigest())
"
# 预期输出:
# SSL: OpenSSL 1.1.1w 11 Sep 2023
# SHA256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
五、Python 模块安装
5.1 检查 Python 和 pip 版本
bash
cd /home/tools/python3.11.4
# 检查 Python 版本
./python3.11 -V
# 检查 pip 版本
./pip -V
5.2 升级 pip
bash
/home/tools/python3.11.4/bin/python3.11 -m pip install --upgrade pip
5.3 安装 requests 模块
bash
# 使用清华镜像源安装
./python3.11 -m pip install requests \
-i https://pypi.tuna.tsinghua.edu.cn/simple/ \
--trusted-host pypi.tuna.tsinghua.edu.cn
5.4 安装 pandas 模块
bash
# 方式一:使用阿里云镜像直接安装
./python3.11 -m pip install pandas \
--disable-pip-version-check \
--progress-bar on \
--retries 3 \
--timeout 30 \
-i https://mirrors.aliyun.com/pypi/simple/
# 方式二:安装本地 wheel 包
./pip3.11 install /home/tools/module/python311/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.whl
# 方式三:下载源码包安装
wget https://files.pythonhosted.org/packages/source/p/pandas/pandas-2.3.3.tar.gz
./python3.11 -m pip install pandas-2.3.3.tar.gz
5.5 安装 numpy 模块
bash
# 指定安装目录
/home/tools/python3.11.4/bin/python3.11 -m pip install \
--target /home/tools/module/python311 \
-i https://mirrors.aliyun.com/pypi/simple/ \
--no-cache-dir \
numpy
5.6 下载离线 wheel 包(用于离线环境)
bash
# 下载预编译的 wheel 包
/home/tools/python3.11.4/bin/pip3.11 download \
-d /home/tools/module/python311 \
-i https://mirrors.aliyun.com/pypi/simple/ \
--no-cache-dir \
--only-binary=all \
pandas numpy requests
六、环境打包
bash
# 返回上级目录
cd /home/
# 打包整个 Python 环境
tar -czvf project-py3-tools.tar.gz tools
# 查看打包结果
ls -lh project-py3-tools.tar.gz