CentOS 7 编译安装 Python 3.12.0

By | 最新修改:2024-08-17

前言

本文主旨

原本 CentOS 7 下通过 Yum 安装的 Python3 版本为 3.6。由于版本太低,不满足一些应用程序对 Python 版本的最低要求。

因此,本文要在 CentOS 7 以编译安装的方式升级 Python 的版本到当前(2023-12)的最新版本—— Python 3.12.0。

因为 CentOS 7 原先的 OpenSSL 版本太旧,不满足高版本 Python 编译安装的最低要求,因而要先升级 OpenSSL 版本到 v1.1.1x,同样是通过编译的方式。

要安装高版本的软件,最好先升级 GCC 的版本,本文将升级 GCC 工具包到 v11。

所有 Python 源代码存档于:https://www.python.org/ftp/python/

什么是 Python

Python 是一种广泛使用的解释型的高级且通过的计算机编程语言。

Python 的特点

python 有以下的特点:

  1. 它同时支持结构化、过程式、反射式、面向对象函数式编程。
  2. 它是动态的脚本编程语言,并具有垃圾回收功能,能够自动管理内存的使用。

  3. 它简洁的语法能够让开发者以更少更清晰的代码来表达想法;

  4. Python 代码使用空格缩进而非符号的方式来区分代码块,这使得用它写的代码相比之下更具有可读性;

  5. Python 若有极强的跨平台能力,可在几乎所有的操作系统中使用;

  6. Python 是自由的开源的且由社群驱动的软件,目前由 “Pyhton 软件基金会” 管理;

  7. Python 是近年来最受欢迎的编程语言之一,当前(2023年12月),它以近 15% 的市场占有率在世界排名第一,碾压 C语言、CPP 和 Java 等传统受欢迎的编程语言。

以上资料来源于网上。

CentOS 7 升级 Python 3.12.0


升级 GCC

安装开发工具包

首先要安装 CentOS 7 的开发工具包,以免到时覆盖掉新的 GCC 可执行文件。

yum update -y
yum group install -y "development tools"

安装 GCC-11

yum update -y
yum install -y centos-release-scl
yum install -y devtoolset-11

启用 GCC-11 相关的组件

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

创建软链接到系统可执行目录

ln -vsf /opt/rh/devtoolset-11/root/bin/* /usr/bin/

检验 GCC-11 是否安装成功

/usr/bin/gcc --version | grep "gcc (GCC) 11."
code=$?

if [ $code -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++GCC-11 安装失败!"
    echo "错误码: $code"
else
    echo "+++++++++++++++++++++++++++++++++GCC-11 安装成功!"
fi

升级 OpenSSL 到 1.1.1

由于当前的 OpenSSL v1.1.1 最高版本是 v1.1.1w,于是便安装这个。

最新版在右边链接的网页: https://ftp.openssl.org/source/

安装 OpenSSL 编译要求的依赖

yum install -y wget zlib-devel perl-IPC-Cmd perl-Test-Simple

设定一个变量,用来安放 OpenSSL 新版本名称

一定要执行这一步,因为这关系到后面下载和文件目录的名字。

OPENSSL_VER=1.1.1w

进入 /tmp 目录

以后的操作均在此目录及其子目录进行。

cd /tmp

下载最新版本的 OpenSSL 源代码

# 下载可能很慢,甚至会超时
# 这时可以删除原文件,再重新下载
wget https://ftp.openssl.org/source/openssl-${OPENSSL_VER}.tar.gz

解压缩和进入源码目录

tar zxf openssl-${OPENSSL_VER}.tar.gz
code=$?

if [ $code -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++OpenSSL 源码压缩包解压失败!"
    echo "错误代码: $code"
else
    cd openssl-${OPENSSL_VER}/
fi

配置和编译

./config --prefix=/usr/local/openssl-${OPENSSL_VER} --openssldir=/etc/ssl-${OPENSSL_VER} shared zlib
code=$?

if [ $code -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++配置源码失败!"
    echo "错误代码: $code"
else
    echo "+++++++++++++++++++++++++++++++++开始编译 OpenSSL v${OPENSSL_VER}"
    make -j2
    code=$?
    if [ $code -gt 0 ]; then
        echo "+++++++++++++++++++++++++++++++++编译 OpenSSL 失败!"
        echo "错误代码: $code"
    else
        echo "+++++++++++++++++++++++++++++++++编译 OpenSSL 成功!"
    fi
fi

安装 OpenSSL

编译成功后的一步是执行安装命令:

if [ $code -eq 0 ]; then
    echo "+++++++++++++++++++++++++++++++++开始安装 OpenSSL v${OPENSSL_VER}"
    make install
    code=$?
    if [ $code -gt 0 ]; then
        echo "+++++++++++++++++++++++++++++++++OpenSSL v${OPENSSL_VER} 安装失败!"
        echo "错误代码: $code"
    else
        echo "+++++++++++++++++++++++++++++++++成功安装 OpenSSL v${OPENSSL_VER}!"
    fi
fi

将新安装的 OpenSSL 库文件目录路径放进系统中

if [ $code -eq 0 ]; then
    bash -c "echo '/usr/local/openssl-${OPENSSL_VER}/lib' >> /etc/ld.so.conf"
    ldconfig -v
fi

查看新安装的 libssl 动态库是否存在

ldconfig -v |grep -i "libssl"

执行结果:

libssl.so.1.1 -> libssl.so.1.1
libssl3.so -> libssl3.so
libssl.so.10 -> libssl.so.1.0.2k

至此,完成对 OpenSSL 的升级安装。

接下来安装当前最新版本的 Python。

编译升级 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_VERSION=3.12.0

下载 Python 源代码压缩包

cd /tmp
wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz
code=$?
if [ $code -gt 0 ]; then
    # 下载失败请重试
    echo "+++++++++++++++++++++++++++++++++Python 源代码下载失败!"
    echo "错误代码: $code"
else
    echo "+++++++++++++++++++++++++++++++++Python 源代码包下载成功!"
fi

解压缩

tar Jxf Python-${PYTHON_VERSION}.tar.xz
code=$?

if [ $code -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++解压缩失败!"
    echo "错误代码: $code"
else
    echo "+++++++++++++++++++++++++++++++++解压缩成功!"
fi

进入 Python 源码目录

echo "+++++++++++++++++++++++++++++++++cd Python-${PYTHON_VERSION}"
cd Python-${PYTHON_VERSION}

确认当前编译安装的环境条件

echo "OpenSSL ver: ${OPENSSL_VER}"
echo "Python ver: ${PYTHON_VERSION}"

进行编译条件操作

./configure --prefix=/usr/local/python-${PYTHON_VERSION} --with-openssl=/usr/local/openssl-${OPENSSL_VER} --with-openssl-rpath=/usr/local/openssl-${OPENSSL_VER}/lib --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

进行 Python 的编译操作

make -j2
code=$?

if [ $code -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++Python 编译失败"
    echo "错误代码: $code"
else
    echo "+++++++++++++++++++++++++++++++++成功进行 Python 编译操作!"
fi

安装 Python v1.12

make altinstall
code=$?

if [ $code -gt 0 ]; then
    echo "+++++++++++++++++++++++++++++++++Python 安装失败!"
    echo "错误代码: $code"
else
    echo "+++++++++++++++++++++++++++++++++Python 安装成功!"
fi

把新 Python 的库目录放进系统

bash -c "echo \"/usr/local/python-${PYTHON_VERSION}/lib\" >> /etc/ld.so.conf"
ldconfig -v
## 以下命令来查实库目录是否已添加
ldconfig -v | grep -i "python"

执行结果:

libpython3.so -> libpython3.so
libpython3.12.so.1.0 -> libpython3.12.so.1.0
libpython2.7.so.1.0 -> libpython2.7.so.1.0

设置新 Python 的环境变量

echo "export PATH=\"${PATH}:/usr/local/python-${PYTHON_VERSION}/bin\"" >>/etc/bashrc
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

设置 PyPI 的国内软件源并升级自身

# 设置国内源
mkdir ~/.pip
cat >~/.pip/pip.conf <<EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
EOF

# 升级 PyPI
python3 -m pip install --upgrade pip

总结

本文通篇分别介绍了数个大话题,其中有:

  • 本文的主要内容概述
  • Python 的简介以及其的特点
  • 如何在 CentOS 7 系统下安装 GCC-11
  • 如何通过源代码编译安装 OpenSSL 1.1.1
  • 如何通过源代码编译安装 Python 1.12.0

程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com