CentOS7 搭建 Python环境

26 阅读4分钟

引言

最近在为团队搭建数仓配套的 Flask 接口服务时,先后遇到了 yum 源报错、SSL 模块编译失败、配置覆盖、软链接冲突等一系列问题。特此整理完整流程,包含所有问题的报错信息、排查思路和解决方案,给有同样需求的小伙伴避坑!

环境说明

  • 系统:CentOS 7.x(64 位)
  • 目标 Python 版本:3.11.6(Flask3.0.0 官方推荐 3.8~3.11,3.11.6 最稳定)
  • 目标 Flask 版本:3.0.0
  • 核心痛点:CentOS7 自带 OpenSSL 1.0.2(Python3.11+ 要求 1.1.1+)、官方 yum 源已停止维护

一、准备工作

1. 工具与源码下载

2. 提前说明

  • 全程使用 root 用户操作(避免权限问题,非 root 需加 sudo
  • 所有命令可直接复制执行,关键步骤会标注 “坑点” 和 “注意事项”
  • 最终 Python 安装路径:/usr/local/python3.11(避免覆盖系统默认 Python2.7)

二、分步搭建流程(含问题解决)

阶段 1:修复 yum 源(CentOS7 必做)

问题现象

执行 yum install 时报错:

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Name or service not known"

原因

CentOS7 已于 2024 年 6 月终止官方支持,mirrorlist.centos.org 失效,需替换为官方归档源。

解决方案

  1. 备份旧 repo 文件
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
  1. 创建新的 CentOS-Base.repo
vi /etc/yum.repos.d/CentOS-Base.repo

粘贴以下内容(官方归档源):

[base]
name=CentOS-7 - Base - vault.centos.org
baseurl=http://vault.centos.org/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-7 - Updates - vault.centos.org
baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-7 - Extras - vault.centos.org
baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7
  1. 清理并生成 yum 缓存
yum clean all
yum makecache

阶段 2:安装编译依赖库

# 安装开发工具组
yum groupinstall -y "Development Tools"
# 安装 Python 编译必需依赖
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

阶段 3:升级 OpenSSL 到 1.1.1w(核心步骤)

问题现象

直接编译 Python3.11.6 会报错:

Could not build the ssl module!
Python requires a OpenSSL 1.1.1 or newer

原因

CentOS7 自带 OpenSSL 1.0.2,不满足 Python3.11+ 要求,需手动升级。

解决方案

  1. 下载并解压 OpenSSL 源码
cd /usr/src
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
  1. 编译安装(指定自定义路径,避免覆盖系统默认)
./config --prefix=/usr/local/openssl-1.1.1 shared zlib
make -j$(nproc)  # 多核加速编译
make install
  1. 配置系统识别新 OpenSSL
# 添加动态链接库缓存
echo '/usr/local/openssl-1.1.1/lib' > /etc/ld.so.conf.d/openssl-1.1.1.conf
ldconfig  # 生效配置
# 验证版本
/usr/local/openssl-1.1.1/bin/openssl version  # 应输出 OpenSSL 1.1.1w

阶段 4:编译安装 Python3.11.6(避坑重点)

坑点 1:连续执行 configure 导致配置覆盖

错误操作

./configure --prefix=/usr/local/python3.11 --with-ssl=/usr/local/openssl-1.1.1
./configure --enable-optimizations  # 第二次执行覆盖了第一次的 --with-ssl 参数

后果

编译时仍会缺失 SSL 模块,白折腾!

正确步骤

  1. 下载并解压 Python 源码
cd /home/ga/python  # 自定义目录,可修改
wget https://mirrors.tuna.tsinghua.edu.cn/python/3.11.6/Python-3.11.6.tgz
curl -O https://mirrors.tuna.tsinghua.edu.cn/python/3.11.6/Python-3.11.6.tgz #curl比wget效率更高
tar -xzf Python-3.11.6.tgz
cd Python-3.11.6
  1. 清理残留配置(若之前编译失败过)
make distclean  # 彻底清理,比 make clean 更彻底
  1. 一次性配置编译参数(关键!)
# 设置环境变量,强制指定 OpenSSL 路径(双重保险)
export LDFLAGS="-L/usr/local/openssl-1.1.1/lib -Wl,-rpath,/usr/local/openssl-1.1.1/lib"
export CPPFLAGS="-I/usr/local/openssl-1.1.1/include"
# 合并所有参数执行 configure
./configure \
  --prefix=/usr/local/python3.11 \
  --with-ssl=/usr/local/openssl-1.1.1 \
  --enable-optimizations  # 编译优化(提升 Python 性能)
  1. 编译 + 安装
make -j$(nproc)  # 多核加速,时间 5-20 分钟
make altinstall  # 用 altinstall 避免覆盖系统 Python2.7
  1. 验证 Python 与 SSL 模块
# 调用新安装的 Python
/usr/local/python3.11/bin/python3.11 -c "
import ssl
print('SSL 模块加载成功!')
print('OpenSSL 版本:', ssl.OPENSSL_VERSION)  # 应输出 1.1.1w
"

成功输出

SSL 模块加载成功!
OpenSSL 版本: OpenSSL 1.1.1w  11 Sep 2023

阶段 5:配置 Python 环境变量(软链接)

问题现象

创建软链接时报错:

ln: failed to create symbolic link ‘/usr/bin/pip3’: File exists

原因

之前安装过其他 Python 版本,旧软链接未删除。

解决方案

  1. 删除旧软链接
# 强制删除旧的 python3 和 pip3 软链接
rm -f /usr/bin/python3
rm -f /usr/bin/pip3
  1. 创建新软链接
# 关联 Python3.11.6
ln -s /usr/local/python3.11/bin/python3.11 /usr/bin/python3
ln -s /usr/local/python3.11/bin/pip3.11 /usr/bin/pip3
  1. 验证
python3 -V  # 输出 Python 3.11.6
pip3 -V     # 输出 pip 23.2.1 from /usr/local/python3.11/lib/python3.11/site-packages/pip (python 3.11)

阶段 6:安装 Flask3.0.0

  1. 配置 pip 国内源(加速安装)
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

成功输出

Writing to /root/.config/pip/pip.conf
  1. 升级 pip 并安装 Flask
pip3 install --upgrade pip  # 升级 pip 到最新版
pip3 install Flask==3.0.0
  1. 验证 Flask 安装
python3 -c "import flask; print('Flask 版本:', flask.__version__)"

成功输出(注意:DeprecationWarning 是正常提示,不影响使用)

<string>:1: DeprecationWarning: The '__version__' attribute is deprecated and will be removed in Flask 3.1. Use feature detection or 'importlib.metadata.version("flask")' instead.
Flask 版本: 3.0.0

三、核心坑点总结

  1. yum 源失效:CentOS7 必须换 vault.centos.org 归档源,否则无法安装依赖;
  2. OpenSSL 版本低:Python3.11+ 强制要求 1.1.1+,需手动编译安装并配置环境变量;
  3. configure 配置覆盖:参数必须一次合并执行,不能分两次 ./configure
  4. 软链接冲突:创建新链接前,先删除旧的 python3/pip3 软链接;
  5. SSL 模块编译失败:通过 LDFLAGS/CPPFLAGS 强制指定 OpenSSL 路径,双重保险。

四、最终验证

# 完整环境验证脚本
python3 -c "
import ssl
import flask
print('✅ 系统环境验证通过!')
print(f'Python 版本:{ssl.__version__}')
print(f'OpenSSL 版本:{ssl.OPENSSL_VERSION}')
print(f'Flask 版本:{flask.__version__}')
"

输出结果

 系统环境验证通过!
Python 版本:3.11.6
OpenSSL 版本:OpenSSL 1.1.1w  11 Sep 2023
Flask 版本:3.0.0

至此,CentOS7 上的 Python3.11.6+Flask3.0.0 环境搭建完成!如果遇到其他问题,欢迎在评论区留言交流~