CentOS 下 Python 3 安装与多版本共存配置教程 – wiki基地


CentOS 下 Python 3 安装与多版本共存终极配置指南

前言:为何在 CentOS 上管理 Python 版本如此重要?

CentOS(Community ENTerprise Operating System)作为 RHEL (Red Hat Enterprise Linux) 的下游分支,以其超凡的稳定性和长期支持(LTS)而闻名于世,成为企业级服务器操作系统的首选。然而,这种对稳定性的极致追求也带来了一个“甜蜜的烦恼”:系统内置的软件包版本往往较为保守。

对于 Python 而言,这一点尤为突出。例如,广泛使用的 CentOS 7 默认的系统 Python 版本是 2.7.x。这个版本在 Python 社区早已停止维护,但对于 CentOS 系统本身,它却是至关重要的。系统的核心工具,如 yum 包管理器、initial-setup 等,都深度依赖于这个旧版本的 Python。任何试图强行替换或删除系统默认 Python 的行为,都可能导致系统功能异常,甚至崩溃。

与此同时,现代化的软件开发、数据科学、人工智能、Web 应用等领域,几乎无一例外地要求使用 Python 3.6 以上的版本。Python 3 带来了大量的语法改进、性能优化和新的标准库,生态系统也已完全迁移。这就造成了一个典型的矛盾:系统稳定性要求保留 Python 2,而应用开发需求拥抱 Python 3

因此,掌握如何在 CentOS 系统上安全地安装 Python 3,并实现 Python 2 与一个或多个 Python 3 版本和谐共存,是每一位 CentOS 用户和管理员必须具备的核心技能。本文将从基础准备工作开始,循序渐进,详细介绍三种主流的 Python 3 安装方法,并重点阐述如何利用 pyenv 这一现代化工具,优雅地实现多版本 Python 的无缝切换与管理,最终结合虚拟环境,打造一个干净、隔离、高效的 Python 开发环境。


第一章:基础准备:磨刀不误砍柴工

在开始安装之前,我们需要对系统进行一系列的检查和准备,确保后续过程顺利无误。

1.1 系统环境检查

首先,登录到你的 CentOS 服务器,确认系统版本和当前的 Python 环境。

查看 CentOS 版本:

bash
cat /etc/redhat-release

输出可能如下(以 CentOS 7 为例):

CentOS Linux release 7.9.2009 (Core)

查看系统默认 Python 版本:

“`bash
python -V

或者

python2 -V
“`

输出通常是:

Python 2.7.5

这个 python 命令链接到的 Python 2.7.5 就是我们绝对不能触碰的“系统 Python”。

1.2 更新系统并安装开发工具集

为了确保我们拥有最新的安全补丁和基础库,并为后续的编译安装做好准备,需要更新系统并安装必要的开发工具。

更新系统软件包:

bash
sudo yum update -y

安装开发工具集和依赖库:

编译 Python 源码需要一系列的工具和库,如 GCC 编译器、make 工具以及各种开发库文件(-devel 包)。yum 提供了 groupinstall 命令,可以方便地一次性安装一整套开发工具。

bash
sudo yum groupinstall "Development Tools" -y

接下来,安装编译 Python 时最常需要的依赖库。这些库提供了对 SSL 加密、zlib 压缩、SQLite 数据库、FFI(外部函数接口)等核心功能的支持。如果缺少这些库,新安装的 Python 将功能残缺,例如 pip 可能无法使用 HTTPS,或者无法安装某些需要 C 扩展的库。

bash
sudo 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

至此,我们的系统已经准备就绪,可以开始安装 Python 3 了。


第二章:Python 3 安装的三种主流方法

我们将介绍三种各具特色的安装方法,你可以根据自己的需求和场景选择最适合的一种。

方法一:使用 SCL (Software Collections Library) – 官方推荐,简单可靠

SCL 是一个由 CentOS/RHEL 官方维护的软件集,它允许你在系统上安装和使用多个版本的软件,而不会影响系统默认的包。这是一种非常安全和推荐的方式,尤其适合那些希望快速搭建环境而不想深入编译细节的用户。

1. 安装 SCL 管理工具:

bash
sudo yum install centos-release-scl -y

2. 安装指定的 Python 3 版本:

你可以使用 yum search 来查看 SCL 提供了哪些 Python 版本。

bash
yum search rh-python

假设我们选择安装 Python 3.8,其包名通常是 rh-python38

bash
sudo yum install rh-python38 -y

3. 启用并使用 SCL 中的 Python 3:

SCL 的核心思想是“按需启用”。安装完成后,新安装的 Python 3 并不会直接覆盖系统命令。你需要通过 scl enable 命令来启动一个包含了新版 Python 环境的 shell。

bash
scl enable rh-python38 bash

执行此命令后,你将进入一个新的 bash 会话。在这个会话中,python 命令将指向 Python 3.8。

“`bash
[new_shell]$ python -V
Python 3.8.x

[new_shell]$ which python
/opt/rh/rh-python38/root/usr/bin/python
“`

退出这个 shell (exit) 后,你的环境会恢复原样,python -V 再次显示 2.7.5。

优点:
* 安全隔离:完全不影响系统原生环境。
* 官方支持:由 CentOS 官方维护,稳定可靠。
* 管理简单:安装和卸载都通过 yum 完成。

缺点:
* 版本有限:可能无法获取到最新版本的 Python。
* 使用稍繁琐:每次使用都需要 scl enable,或者需要修改 shell 配置文件(如 ~/.bashrc)来自动加载。


方法二:从源码编译安装 – 极致灵活,掌控一切

对于需要特定版本(包括最新版)或自定义编译选项的开发者来说,从源码编译安装是最佳选择。这种方法给予你最大的控制权。

关键原则: 永远不要覆盖系统 Python。我们将通过 --prefix 指定一个独立的安装目录,并使用 make altinstall 来避免创建 python 这个软链接。

1. 下载 Python 源码包:

前往 Python 官方网站(https://www.python.org/ftp/python/)找到你想要的版本。这里以 Python 3.10.7 为例。

“`bash

进入一个用于存放源码的目录,例如 /usr/src

cd /usr/src

下载源码包

sudo wget https://www.python.org/ftp/python/3.10.7/Python-3.10.7.tgz
“`

2. 解压源码包:

bash
sudo tar xzf Python-3.10.7.tgz

3. 配置、编译与安装:

进入解压后的目录,并执行配置、编译和安装三部曲。

bash
cd Python-3.10.7

配置 (configure): 这一步是整个过程的核心。
* --prefix=/usr/local/python3.10: 指定安装路径。将其安装到 /usr/local 目录下是一个好习惯,这能将其与系统自带的、由包管理器管理的软件(通常在 /usr/bin)区分开。
* --enable-optimizations: 启用性能优化。这会让编译过程变慢,但会通过运行性能分析测试(PGO)来提升最终生成二进制文件的执行效率。

bash
sudo ./configure --prefix=/usr/local/python3.10 --enable-optimizations

编译 (make): 使用 make 命令进行编译。-j 参数可以指定并行的任务数,通常设为 CPU 核心数,以加快编译速度。

“`bash

查看 CPU 核心数

nproc

假设有 4 个核心

sudo make -j 4
“`

安装 (make altinstall): 这是最关键的一步!
* make altinstall vs make install:
* make install 会创建 pythonpip 等软链接,如果安装目录在 PATH 中,可能会覆盖系统默认的 python 命令,导致灾难。
* make altinstall 则只会创建带有版本号的命令,如 python3.10pip3.10。这正是我们实现版本共存所需要的。

bash
sudo make altinstall

4. 验证安装:

安装完成后,新的 Python 可执行文件应该位于 /usr/local/python3.10/bin 目录下。

bash
/usr/local/python3.10/bin/python3.10 -V

输出应为:

Python 3.10.7

5. 创建软链接以便于访问 (可选但推荐):

为了方便在命令行直接使用 python3pip3,可以手动创建软链接到 /usr/local/bin (或者 /usr/bin,但 /usr/local/bin 更符合规范)。

“`bash
sudo ln -s /usr/local/python3.10/bin/python3.10 /usr/local/bin/python3.10
sudo ln -s /usr/local/python3.10/bin/pip3.10 /usr/local/bin/pip3.10

如果希望 python3 命令指向这个版本

sudo ln -s /usr/local/python3.10/bin/python3.10 /usr/local/bin/python3
sudo ln -s /usr/local/python3.10/bin/pip3.10 /usr/local/bin/pip3
“`

现在,你可以直接使用 python3 -V 来验证了。

优点:
* 版本自由:可以安装任何版本的 Python。
* 高度定制:可以通过编译选项进行深度定制和优化。

缺点:
* 过程复杂:步骤较多,容易出错。
* 依赖管理:需要手动安装所有编译依赖。
* 升级维护:未来升级版本需要重复整个编译过程。


方法三:使用 pyenv – 现代化的 Python 版本管理大师

pyenv 是一个强大而优雅的 Python 版本管理工具。它允许你在用户级别轻松地安装、切换和管理多个 Python 版本,完全不触及系统 Python,也不会污染全局环境。这是目前社区最推崇的多版本管理方案。

pyenv 的工作原理是通过在 PATH 环境变量的开头注入一个“垫片”(shims)目录。当你执行 python 命令时,系统会首先找到 pyenv 的垫片脚本,该脚本会根据你当前的配置(全局、项目或当前 shell),决定将命令转发给哪个实际的 Python 解释器。

1. 安装 pyenv 及其依赖:

首先,安装 git 和其他编译 Python 所需的依赖(我们在第一章已经做过)。

bash
sudo yum install git -y

pyenv 官方提供了一个便捷的安装脚本:

bash
curl https://pyenv.run | bash

2. 配置环境变量:

安装脚本会在最后提示你需要将几行配置添加到你的 shell 启动文件中(通常是 ~/.bashrc~/.bash_profile)。

“`bash

对于 bash

echo ‘export PYENV_ROOT=”$HOME/.pyenv”‘ >> ~/.bashrc
echo ‘command -v pyenv >/dev/null || export PATH=”$PYENV_ROOT/bin:$PATH”‘ >> ~/.bashrc
echo ‘eval “$(pyenv init -)”‘ >> ~/.bashrc

使配置立即生效

source ~/.bashrc
“`

验证 pyenv 是否安装成功:

bash
pyenv --version

3. 使用 pyenv 安装 Python 版本:

现在,安装 Python 变得异常简单。

查看可安装的版本列表:

bash
pyenv install --list

安装一个或多个 Python 版本:
例如,我们安装 3.8.13 和 3.10.7。

bash
pyenv install 3.8.13
pyenv install 3.10.7

pyenv 会自动下载源码,并以最佳实践进行编译和安装,所有版本都存放在 ~/.pyenv/versions/ 目录下,与系统完全隔离。

4. pyenv 的核心:版本切换

pyenv 提供了三个维度的版本控制:global, local, 和 shell

  • global:设置全局默认的 Python 版本。

    “`bash
    pyenv global 3.10.7
    python -V

    Python 3.10.7

    ``
    这个设置会写入
    ~/.pyenv/version` 文件,对当前用户的所有会话生效。

  • local:设置当前目录及其子目录下的 Python 版本。这对于项目级别的版本锁定至关重要。

    “`bash
    mkdir my-project
    cd my-project
    pyenv local 3.8.13

    pyenv 会在当前目录创建一个 .python-version 文件

    cat .python-version

    3.8.13

    python -V

    Python 3.8.13

    离开这个目录,版本会恢复为 global 设置

    cd ..
    python -V

    Python 3.10.7

    “`

  • shell:仅为当前 shell 会话设置 Python 版本,优先级最高。

    “`bash
    pyenv shell 2.7.5 # 甚至可以切换回系统版本(如果 pyenv 已知)
    python -V

    Python 2.7.5

    “`

查看已安装和当前使用的版本:

bash
pyenv versions

输出会清晰地标出所有已安装版本,并用星号 * 标记当前激活的版本。

优点:
* 完美隔离:完全不影响系统环境,所有操作都在用户主目录下。
* 切换自如global, local, shell 三种模式满足所有场景需求。
* 自动化管理:自动处理下载、编译、安装过程。
* 生态强大:可以与 pyenv-virtualenv 等插件无缝集成。

缺点:
* 初次设置:需要理解其工作原理并正确配置环境变量。


第三章:终极武器:pyenv + 虚拟环境

即使有了 pyenv 进行版本管理,我们仍然需要虚拟环境来隔离不同项目的依赖包。想象一下:项目 A 需要 requests==2.20.0,而项目 B 需要 requests==2.28.0。如果在全局环境中安装,这两个版本就会冲突。虚拟环境正是解决这个问题的利器。

Python 3.3+ 自带了 venv 模块,但 pyenv 有一个更强大的插件 pyenv-virtualenv,它将版本管理和环境管理完美结合。

1. 安装 pyenv-virtualenv 插件:

如果你的 pyenv 是通过 git 克隆安装的,可以这样安装插件:

bash
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

然后,在 ~/.bashrc 中添加一行配置:

bash
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc

2. 创建和使用虚拟环境:

现在,你可以基于 pyenv 安装的任何 Python 版本来创建虚拟环境。

创建虚拟环境:
pyenv virtualenv <python_version> <environment_name>

“`bash

基于 Python 3.8.13 创建一个名为 “project-a-env” 的环境

pyenv virtualenv 3.8.13 project-a-env

基于 Python 3.10.7 创建一个名为 “data-science-env” 的环境

pyenv virtualenv 3.10.7 data-science-env
“`

激活虚拟环境:
最酷的功能是,你可以像设置 pyenv local 一样,将虚拟环境与项目目录绑定。

bash
mkdir project-a
cd project-a
pyenv local project-a-env

当你进入 project-a 目录时,pyenv 会自动激活 project-a-env 这个虚拟环境。你的命令提示符可能会发生变化,指示当前所处的环境。

“`bash
(project-a-env) user@host:~/project-a$ python -V
Python 3.8.13

(project-a-env) user@host:~/project-a$ which python
/home/user/.pyenv/versions/project-a-env/bin/python

(project-a-env) user@host:~/project-a$ pip install requests==2.20.0

“`

在这个环境下安装的所有包,都将被隔离在 ~/.pyenv/versions/project-a-env/ 目录下,不会影响其他任何项目或全局环境。

当你离开这个目录,虚拟环境会自动停用。

总结:最佳实践与选择建议

经过以上详细的介绍,我们来总结一下在 CentOS 上管理 Python 版本的最佳实践:

  1. 敬畏系统 Python:永远不要尝试修改、升级或删除 CentOS 自带的 Python 2.x。它是系统稳定的基石。

  2. 场景化选择安装方法

    • 新手或求稳定:如果你只是需要一个能用的 Python 3,且对版本要求不高,SCL 是最安全、最省心的选择。
    • 高级用户或特定需求:如果你需要最新的 Python 版本,或需要开启特定的编译优化,从源码编译是你的不二之选,但务必使用 --prefixmake altinstall
    • 专业开发者(强烈推荐):如果你需要在多个 Python 版本之间频繁切换,或者需要为每个项目维护独立的环境,pyenv + pyenv-virtualenv 是当之无愧的黄金组合。它提供了无与伦比的灵活性和隔离性,是现代 Python 开发的标配。
  3. 拥抱虚拟环境:无论你使用哪种方法安装了 Python 3,始终为你的每一个项目创建独立的虚拟环境。这是避免“依赖地狱”的唯一有效途径,也是保持开发环境整洁专业的关键。

通过遵循本指南的步骤,你现在应该已经能够在你的 CentOS 服务器上,充满信心地安装和管理任何你需要的 Python 3 版本,同时确保系统稳定如初。这不仅让你能够跟上现代 Python 生态的步伐,也为你打造一个高效、可复现、无冲突的专业开发环境奠定了坚实的基础。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部