1. 引言

Ubuntu 22.04 LTS(Jammy Jellyfish)默认只预装了 Python 3。然而,在开发、运维或维护遗留项目时,我们常常需要同时使用 Python 2 和 Python 3。本文将详细介绍在 Ubuntu 22.04 上如何安全、高效地配置 Python 2 和 Python 3 共存环境,包括安装、版本管理、切换方法以及重要的使用注意事项。

2. 系统默认 Python 情况

在 Ubuntu 22.04 中:

  • Python 3:系统默认安装,通常为 python3 命令,对应的可执行文件是 /usr/bin/python3。系统级的 python 命令可能不存在或指向 python3
  • Python 2不再默认安装。由于 Python 2 已于 2020 年 1 月 1 日停止官方支持,Ubuntu 22.04 移除了其默认安装包。

因此,我们需要手动安装 Python 2,并妥善管理两个版本,避免干扰系统关键组件。

3. 安装 Python 3(如未安装或需特定版本)

虽然系统已预装 Python 3,但你可能需要安装其他版本(如 3.8, 3.9, 3.10)。

3.1 安装特定版本的 Python 3

使用 apt 安装(推荐安装 python3.xpython3.x-venv):

sudo apt update
sudo apt install python3.9 python3.9-venv python3.9-dev

3.2 验证安装

python3.9 --version
# 输出类似:Python 3.9.18

4. 安装 Python 2

由于官方仓库已移除 Python 2,我们需要从 universe 仓库或第三方 PPA 安装。

4.1 启用 universe 仓库并安装

sudo add-apt-repository universe
sudo apt update
sudo apt install python2

如果上述方法失败,可以尝试安装 python2.7 包:

sudo apt install python2.7

4.2 验证 Python 2 安装

python2 --version
# 输出类似:Python 2.7.18

5. 管理多版本 Python:使用 update-alternatives

update-alternatives 是 Debian/Ubuntu 系统管理多个同类型命令(如 python, pip)默认版本的官方工具。

5.1 为 python 命令设置替代项

  1. 注册 Python 3(假设使用 /usr/bin/python3):

    sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
    
  2. 注册 Python 2

    sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 2
    

    数字 12 是优先级,数字越大优先级越高。这里设置 Python 2 优先级更高(2 > 1),但最终选择权在交互菜单。

5.2 切换默认 python 命令版本

运行以下命令进入交互式选择菜单:

sudo update-alternatives --config python

你会看到类似输出:

There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3     1         auto mode
  1            /usr/bin/python2     2         manual mode
  2            /usr/bin/python3     1         manual mode

Press <enter> to keep the current choice[*], or type selection number:

输入对应的数字(例如 1 选择 Python 2,2 选择 Python 3)并按回车。

5.3 验证切换结果

python --version

6. 虚拟环境管理:隔离项目依赖

强烈建议为每个项目使用虚拟环境,避免全局包冲突。

6.1 为 Python 3 创建虚拟环境

使用 venv 模块(Python 3.3+ 内置):

python3 -m venv myproject_env
source myproject_env/bin/activate
# 激活后,命令行提示符会变化

6.2 为 Python 2 创建虚拟环境

Python 2 需要使用 virtualenv 工具。

  1. 先安装 virtualenv(用 Python 3 的 pip 安装):
    pip install virtualenv
    
  2. 为 Python 2 项目创建虚拟环境:
    virtualenv -p python2 myproject_py2_env
    source myproject_py2_env/bin/activate
    

7. 包管理工具 pip 的版本管理

每个 Python 版本都有其对应的 pip

  • Python 3 的 pip:通常为 pip3 命令。
  • Python 2 的 pip:需要手动安装或使用 python2 -m pip

7.1 确保 Python 2 有 pip

curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
sudo python2 get-pip.py

安装后,可以使用 pip2 命令或 python2 -m pip

7.2 在虚拟环境中使用 pip

在虚拟环境激活后,直接使用 pip 命令即可,它会自动关联到当前环境的 Python 版本。

8. 使用注意事项与常见问题

8.1 不要删除系统自带的 Python 3

Ubuntu 的许多系统工具(如 apt、gnome-terminal)依赖 /usr/bin/python3。删除或替换它可能导致系统不稳定。

8.2 脚本的 Shebang 行

在脚本开头明确指定解释器版本,避免依赖模糊的 #!/usr/bin/env python

  • 用 Python 3:#!/usr/bin/env python3
  • 用 Python 2:#!/usr/bin/env python2

8.3 使用 python -m 执行模块

运行模块时,显式指定版本可以避免混淆:

python3 -m pip install package  # 为 Python 3 安装包
python2 -m pip install package  # 为 Python 2 安装包

8.4 检查当前环境

在脚本或命令行中,可以快速检查:

import sys
print(sys.version_info.major)  # 输出 2 或 3

8.5 兼容性工具

对于需要同时支持 Python 2 和 3 的代码,可以考虑使用:

  • 2to3:将 Python 2 代码自动转换为 Python 3。
  • six:一个兼容库,帮助编写同时支持 Python 2 和 3 的代码。
  • future:提供 Python 3 特性在 Python 2 中的 backport。

9. 总结

在 Ubuntu 22.04 上管理 Python 2 和 Python 3 的关键步骤:

  1. 安装:从 universe 仓库安装 Python 2,系统已自带 Python 3。
  2. 管理默认版本:使用 update-alternatives --config python 安全切换全局 python 命令。
  3. 项目隔离:为每个项目创建独立的虚拟环境(venv 用于 Python 3,virtualenv 用于 Python 2)。
  4. 明确指定:在脚本和命令中,尽量使用 python2python3pip2pip3 来避免歧义。
  5. 保持系统稳定:不要动系统自带的 /usr/bin/python3

遵循这些实践,你可以在 Ubuntu 22.04 上轻松驾驭双 Python 版本环境,兼顾新项目开发和旧项目维护。

更多推荐