前言
本文主旨
原本 CentOS 7 下通过 Yum 安装的 Python3 版本为 3.6。由于版本太低,不满足一些应用程序对 Python 版本的最低要求。
因此,本文要在 CentOS 7 以编译安装的方式升级 Python 的版本到当前(2025-04)的最新稳定版本—— Python 3.12.9。
因为 CentOS 7 原先的 OpenSSL 版本太旧,不满足高版本 Python 的编译要求,可选择先安装 openssl11,通过添加 EPEL 源方式安装它。
要安装高版本的软件,最好先升级 GCC 的版本,本文将升级 GCC 工具包到 v11。
所有 Python 源代码存档于:https://www.python.org/ftp/python/
什么是 Python
Python 是一种广泛使用的解释型的高级且通用的计算机编程语言。
Python 语言目前在数据分析、人工智能、网络爬虫、科学计算、图形界面应用等技术方向使用极其广泛,当然它也有很强 Web 开发的能力。
之所以 Python 有这样的跨界应用的能力,不得不归功于它的易用性,以及它那规模庞大且丰富的软件库(需要通过 PyPI 等软件包管理器来安装)。
Python 代码结构清晰优雅,它有个众周所知的信条——“Write less, do more”(写得少但做得多)。
Python 的特点
python 有以下的特点:
- 它同时支持结构化、过程式、反射式、面向对象函数式编程。
它是动态的脚本编程语言,并具有垃圾回收功能,能够自动管理内存的使用。
它简洁的语法能够让开发者以更少更清晰的代码来表达想法;
Python 代码使用空格缩进而非符号的方式来区分代码块,这使得用它写的代码相比之下更具有可读性;
Python 若有极强的跨平台能力,可在几乎所有的操作系统中使用;
Python 是自由的开源的且由社群驱动的软件,目前由 “Python 软件基金会” 管理;
Python 是近年来最受欢迎的编程语言之一,最近(2025年02月),它以近 23.88% 的市场占有率再次在世界排名第一,碾压 C语言、CPP 和 Java 等传统受欢迎的编程语言。
更换 CentOS 7 的软件源
由于 CentOS 7 的生命周期已经结束,所以要将其软件源更改为能够使用的镜像源网址。
这里选择阿里云的镜像。
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 或者
wget --continue -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
升级 GCC
安装开发工具包
首先要安装 CentOS 7 的开发工具包,以免到时覆盖掉新的 GCC 可执行文件。
cat>/tmp/installer.sh<<EOF
yum update -y
yum group install -y "development tools"
EOF
bash /tmp/installer.sh
安装 GCC-11
cat>/tmp/installer.sh<<EOF
yum update -y
yum install -y centos-release-scl
cd /etc/yum.repos.d
sed -i "s@mirrorlist=@# mirrorlist=@g" CentOS-SCLo-scl.repo
sed -i "s@mirrorlist=@# mirrorlist=@g" CentOS-SCLo-scl-rh.repo
sed -i "s@# baseurl=http://mirror.centos.org@baseurl=https://mirrors.aliyun.com@g" CentOS-SCLo-scl.repo
sed -i "s@#baseurl=http://mirror.centos.org@baseurl=https://mirrors.aliyun.com@g" CentOS-SCLo-scl-rh.repo
yum install -y devtoolset-11
EOF
bash /tmp/installer.sh
启用 GCC-11 相关的组件
cat>/tmp/installer.sh<<EOF
cat /etc/bashrc | grep -i "/opt/rh/devtoolset-11/enable"
if [ \$? -gt 0 ]; then
echo "source /opt/rh/devtoolset-11/enable" >>/etc/bashrc
fi
source /etc/bashrc
EOF
bash /tmp/installer.sh
创建软链接到系统可执行目录
ln -vsf /opt/rh/devtoolset-11/root/bin/* /usr/bin/
检验 GCC-11 是否安装成功
cat>/tmp/installer.sh<<EOF
/usr/bin/gcc --version | grep "gcc (GCC) 11."
code=\$?
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++GCC-11 安装失败!"
echo "错误码: \$code"
else
echo "+++++++++++++++++++++++++++++++++GCC-11 安装成功!"
fi
EOF
bash /tmp/installer.sh
安装 OpenSSL11
cat>/tmp/installer.sh<<EOF
yum install -y epel-release wget
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
yum update -y
yum install -y openssl-devel openssl11 openssl11-devel openssl11-libs
EOF
bash /tmp/installer.sh
接下来安装 Python 3.12。
编译升级 Python
安装依赖
yum install -y wget bzip2-devel libffi-devel \
ncurses-devel gdbm-devel xz-devel sqlite-devel \
tk-devel uuid-devel readline-devel
设置版本号
最新源码包可在 https://www.python.org/ftp/python/ 找到。
阿里云 Python 源代码镜像:https://mirrors.aliyun.com/python-release/source/。
本文的脚本要求在同一个命令行实例下运行,因为要设置 Python 版本号。
export PYTHON_VERSION=3.12.9
## export PYTHON_VERSION=3.13.3
下载 Python 源代码压缩包
cat>/tmp/installer.sh<<EOF
cd /tmp
## wget --continue https://www.python.org/ftp/python/\${PYTHON_VERSION}/Python-\${PYTHON_VERSION}.tar.xz
# 境内加速
wget --continue https://mirrors.aliyun.com/python-release/source/Python-\${PYTHON_VERSION}.tar.xz
code=\$?
if [ \$code -gt 0 ]; then
# 下载失败请重试
echo "+++++++++++++++++++++++++++++++++Python 源代码下载失败!"
echo "错误代码: \$code"
else
echo "+++++++++++++++++++++++++++++++++Python 源代码包下载成功!"
fi
EOF
bash /tmp/installer.sh
解压缩
cat>/tmp/installer.sh<<EOF
cd /tmp
tar Jxf Python-\${PYTHON_VERSION}.tar.xz
code=\$?
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++解压缩失败!"
echo "错误代码: \$code"
else
echo "+++++++++++++++++++++++++++++++++解压缩成功!"
fi
EOF
bash /tmp/installer.sh
进行编译条件配置操作
cat>/tmp/installer.sh<<EOF
echo "+++++++++++++++++++++++++++++++++进入目录 Python-\${PYTHON_VERSION}"
cd /tmp
cd Python-\${PYTHON_VERSION}
echo "+++++++++++++++++++++++++++++++++在文件 configure 中替换 openssl:"
sed -i 's/PKG_CONFIG openssl /PKG_CONFIG openssl11 /g' configure
export CFLAGS="$CFLAGS $(pkg-config --cflags openssl11)"
export LDFLAGS="$LDFLAGS $(pkg-config --libs openssl11)"
./configure --prefix=/usr/local/python-\${PYTHON_VERSION} \
--enable-shared --enable-ipv6 ax_cv_c_float_words_bigendian=no \
--enable-optimizations
# ./configure --prefix=/usr/local/python-\${PYTHON_VERSION} \
# --with-openssl=/usr/local/openssl-\${OPENSSL_VER} \
# --with-openssl-rpath=/usr/local/openssl-\${OPENSSL_VER}/lib \
# --with-ssl-default-suites=openssl \
# --enable-shared --enable-ipv6 \
# ax_cv_c_float_words_bigendian=no --enable-optimizations
code=\$?
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++Python 编译条件配置执行失败!"
echo "错误代码: \$code"
else
echo "+++++++++++++++++++++++++++++++++Python 编译条件配置执行成功!"
fi
EOF
bash /tmp/installer.sh
进行 Python 的编译操作
cat>/tmp/installer.sh<<EOF
echo "+++++++++++++++++++++++++++++++++cd Python-\${PYTHON_VERSION}"
cd /tmp
cd Python-\${PYTHON_VERSION}
make -j2
code=\$?
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++Python 编译失败"
echo "错误代码: \$code"
else
echo "+++++++++++++++++++++++++++++++++成功完成 Python 编译操作!"
fi
EOF
bash /tmp/installer.sh
安装 Python v3.12.9
cat>/tmp/installer.sh<<EOF
echo "+++++++++++++++++++++++++++++++++cd Python-\${PYTHON_VERSION}"
cd /tmp
cd Python-\${PYTHON_VERSION}
make altinstall
code=\$?
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++Python 安装失败!"
echo "错误代码: \$code"
else
echo "+++++++++++++++++++++++++++++++++删除 Python 源码包和目录:"
sleep 5
rm -rfv /tmp/Python-\${PYTHON_VERSION}*
echo "+++++++++++++++++++++++++++++++++Python 安装成功!"
fi
EOF
bash /tmp/installer.sh
把新 Python 的库目录放进系统
cat>/tmp/installer.sh<<EOF
bash -c "echo \"/usr/local/python-\${PYTHON_VERSION}/lib\" >> /etc/ld.so.conf"
ldconfig -v
## 以下命令来查实库目录是否已添加
ldconfig -v | grep -i "python"
EOF
bash /tmp/installer.sh
执行结果:
/usr/local/python-3.12.9/lib:
libpython3.so -> libpython3.so
libpython3.12.so.1.0 -> libpython3.12.so.1.0
libpython2.7.so.1.0 -> libpython2.7.so.1.0
添加系统变量
cat>/tmp/installer.sh<<EOF
cd /tmp
echo 'export LD_LIBRARY_PATH="/usr/local/python-${PYTHON_VERSION}/lib:\${LD_LIBRARY_PATH}"' >>/etc/profile
EOF
bash /tmp/installer.sh
source /etc/profile
设置新 Python 的环境变量
cat>/tmp/installer.sh<<EOF
cd /tmp
echo 'export PATH="\${PATH}:/usr/local/python-${PYTHON_VERSION}/bin"' >>/etc/bashrc
EOF
bash /tmp/installer.sh
source /etc/bashrc
将新 Python 的可执行文件覆盖系统原有的文件
ln -sf /usr/local/python-${PYTHON_VERSION}/bin/python3.12 /usr/bin/python3
ln -sf /usr/local/python-${PYTHON_VERSION}/bin/pip3.12 /usr/bin/pip3
ln -sf /usr/local/python-${PYTHON_VERSION}/bin/pip3.12 /usr/bin/pip
设置 PyPI 的国内软件源并升级自身
# 升级 PyPI 到最新版本
# 必须先执行升级操作
python3 -m pip install --upgrade pip
### # 设置国内源
### python3 -m pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
### ## sudo python3 -m pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
###
### # python3 -m pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
### # sudo python3 -m pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
mkdir ~/.pip
cat>~/.pip/pip.conf<<EOF
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF
## sudo mkdir ~/.pip
## sudo bash -c 'cat>~/.pip/pip.conf<<EOF
## [global]
## index-url = http://mirrors.aliyun.com/pypi/simple/
##
## [install]
## trusted-host=mirrors.aliyun.com
## EOF'
# 测试一下安装 PyPI 软件包
python3 -m pip install --upgrade requests
# 测试一下 Requests 是否正常安装
# 若无任何输出,则表明 PyPI 是正常使用的
python3 -c 'import requests'
总结
本文通篇分别介绍了数个话题,其中有:
- 本文的主要内容概述;
- Python 的简介以及其的特点;
- 如何在 CentOS 7 系统下安装 GCC-11;
- 为编译 Python 3 安装了 EPEL,并为其配置了国内镜像源(阿里云 EPEL 镜像源);
- 通过 EPEL 安装了 openssl11 openssl11-devel 等软件包;
- 如何让通过源代码编译安装 Python 3.12.9 时使用 openssl11;
- 以及自我升级了 PyPI 的版本;
- 如何给 PyPI(pip3)更换上国内镜像源(清华大学镜像源);
- 最后测试一下编译安装的 PIP3 是否能正常安装软件包。
鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。
本文章可以转载,但是需要说明来源出处!
本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com