前言
本文主旨
原本 CentOS 7 下通过 Yum 安装的 Python3 版本为 3.6。由于版本太低,不满足一些应用程序对 Python 版本的最低要求。
因此,本文要在 CentOS 7 以编译安装的方式升级 Python 的版本 3.12.9。
因为原先的 OpenSSL 版本太旧,不满足高版本 Python 的编译要求,可选择先安装 openssl11,通过添加 EPEL 源方式安装它。
要安装高版本的软件,最好先升级 GCC 的版本,本文将升级 GCC 工具包到 v11。
所有 Python 源代码存档于:https://www.python.org/ftp/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
启用相关的组件
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/
检验编译器是否安装成功
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
下载源代码压缩包
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
code=\$?
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++Python 编译条件配置执行失败!"
echo "错误代码: \$code"
else
echo "+++++++++++++++++++++++++++++++++Python 编译条件配置执行成功!"
fi
EOF
bash /tmp/installer.sh
进行编译操作
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
安装
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
把新的动态库目录放进系统搜索路径
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
设置 PATH 环境变量
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
将可执行文件覆盖系统原有的文件
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
注意事项:
这里千万不要覆盖 Python2 的相关环境,因为 CentOS 7 的 Yum 命令依赖 Python2
设置 PyPI 的国内软件源并升级自身
# 升级 PyPI 到最新版本
# 必须先执行升级操作
python3 -m pip install --upgrade pip
mkdir ~/.pip
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


