Ubuntu 18.04安全升级Python 3.12:5分钟搞定PPA安装与虚拟环境配置

📅 2026/7/26 6:07:52 👁️ 阅读次数 📝 编程学习
Ubuntu 18.04安全升级Python 3.12:5分钟搞定PPA安装与虚拟环境配置

1. 项目概述:为什么Ubuntu 18.04必须告别Python 2.7?

如果你还在用Ubuntu 18.04,并且系统里默认的Python版本还是2.7,那这篇文章就是为你准备的。Ubuntu 18.04 LTS(Bionic Beaver)在2018年发布时,为了兼容大量遗留软件,依然将Python 2.7作为默认的python命令。但Python 2.7官方支持早在2020年1月1日就已终止,这意味着它不再接收任何安全更新或bug修复。继续使用它,就像开着一辆没有安全气囊和ABS的老爷车上高速,潜在风险不言而喻。

与此同时,Python 3.12带来了显著的性能提升、更清晰的错误信息、更灵活的f-string语法等新特性,对现代开发至关重要。然而,在Ubuntu 18.04上直接升级Python,尤其是要替换系统默认的2.7,是一个需要谨慎操作的过程。粗暴地删除或覆盖系统Python,可能导致apt包管理器等核心系统工具崩溃,因为很多系统脚本依然依赖python2。我们的目标是在保留系统Python 2.7环境(以供系统内部使用)的前提下,将用户级的pythonpip命令无缝切换到最新的Python 3.12,并确保pip能正常工作。这个过程,熟练的话确实能在5分钟左右搞定,但其中的细节和“坑”需要提前知晓。

2. 核心思路与方案选型:编译安装 vs PPA源

在Linux上安装新版本的Python,主流方法有两种:从源代码编译安装,或者使用第三方维护的PPA(Personal Package Archive)软件源。我们需要根据Ubuntu 18.04的现状做出选择。

2.1 编译安装的利与弊

从python.org下载源代码,在本地编译安装,是最彻底、最灵活的方式。你可以自定义安装路径(如/usr/local/opt)、优化编译参数以获得最佳性能。但它的缺点也很明显:

  1. 耗时:在配置一般的虚拟机上,编译Python 3.12可能需要15-30分钟,远超我们的“5分钟”目标。
  2. 依赖管理复杂:需要手动安装一堆开发库,如build-essential,libssl-dev,zlib1g-dev,libncurses5-dev等,缺少任何一个都可能导致编译失败或某些功能(如SSL模块)不可用。
  3. 后续维护:升级或卸载需要手动处理。

对于追求快速、稳定、且不需要极端自定义的用户来说,在Ubuntu环境下,这不是首选。

2.2 PPA源方案的可行性分析

PPA是Ubuntu社区用户上传软件包的仓库。deadsnakes团队维护了一个非常知名的PPA,专门提供多个Python版本,覆盖了从旧版到最新开发版的众多选择。它的优势在于:

  1. 快速安装:通过apt安装,省去编译时间。
  2. 自动依赖处理apt会自动解决并安装所有必需的库。
  3. 易于管理:可以像管理系统其他软件一样,用apt进行后续的升级或移除。

经过验证,deadsnakes/ppa为Ubuntu 18.04提供了Python 3.12的预编译包。因此,我们将采用PPA方案作为核心升级路径。这能最大程度保证安装速度与系统兼容性,是实现“5分钟搞定”的关键。

2.3 系统Python与用户Python的隔离策略

我们必须坚守一个铁律:绝不直接替换/usr/bin/python3(通常是系统自带的Python 3.6)或删除Python 2.7。系统级的python3可能被apt、桌面环境或其他系统组件依赖。我们的策略是:

  1. 通过PPA安装python3.12,它会将解释器安装在/usr/bin/python3.12
  2. 通过update-alternatives工具,优雅地管理python3pip3等命令的指向。
  3. 确保python命令(不带数字)的指向可控,通常建议通过虚拟环境(venv)来使用,避免全局冲突。

这个策略确保了系统稳定性与开发灵活性并存。

3. 5分钟实操:从添加PPA到完成Python 3.12安装

现在,我们开始分步操作。请打开你的终端。

3.1 第一步:更新系统并安装基础工具(约1分钟)

首先,确保你的软件包列表是最新的,并安装一些后续可能用到的工具。

sudo apt update sudo apt upgrade -y sudo apt install -y software-properties-common curl
  • software-properties-common提供了add-apt-repository命令,用于添加PPA。
  • 执行upgrade是为了避免现有软件包版本过旧导致依赖问题。

3.2 第二步:添加deadsnakes PPA并安装Python 3.12(约2分钟)

这是核心步骤。我们将添加PPA源并安装Python 3.12及其对应的pipvenv模块。

sudo add-apt-repository ppa:deadsnakes/ppa -y sudo apt update sudo apt install -y python3.12 python3.12-venv python3.12-distutils
  • add-apt-repository -y中的-y参数表示自动确认添加。
  • 再次sudo apt update是为了刷新软件包列表,使新添加的PPA中的包信息生效。
  • python3.12:主程序包。
  • python3.12-venv:Python 3.12的虚拟环境模块,现代Python开发必备。
  • python3.12-distutils:包含distutils模块,某些旧版pip安装脚本或包可能会用到它。

注意deadsnakesPPA通常不直接提供python3.12-pip包。这是因为从Python 3.4开始,pip的推荐安装方式是通过ensurepip模块或get-pip.py脚本。我们稍后会专门处理pip的安装。

安装完成后,验证一下:

python3.12 --version

你应该能看到输出:Python 3.12.x

3.3 第三步:使用update-alternatives配置命令优先级(约1分钟)

现在系统里可能有多个Python 3版本(如自带的3.6和我们刚装的3.12)。update-alternatives可以帮助我们管理系统命令的多个备选方案。

首先,为python3命令设置备选:

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 2
  • --install <链接> <名称> <路径> <优先级>:在系统中注册一个备选项。
  • 链接:/usr/bin/python3,即命令的实际位置。
  • 名称:python3,是这个备选组的名称。
  • 路径:解释器的实际路径,这里我们注册了3.6和3.12。
  • 优先级:数字越大,优先级越高。我们给3.12设置更高的优先级2。

现在,当你在终端输入python3时,系统会自动调用优先级最高的python3.12。你可以手动切换:

sudo update-alternatives --config python3

终端会列出所有选项,输入对应序号即可切换。通常我们保持3.12为默认。

3.4 第四步:修复与安装pip(关键步骤,约1分钟)

这是最容易出问题的环节。在Ubuntu 18.04上,直接运行python3.12 -m ensurepipapt install python3-pip(这会安装针对系统Python 3.6的pip)都可能无法为Python 3.12正确安装pip。

推荐使用官方get-pip.py脚本,这是最通用、最可靠的方法。

  1. 下载官方安装脚本

    curl -sS https://bootstrap.pypa.io/get-pip.py -o get-pip.py

    -sS参数表示静默模式但显示错误,-o指定输出文件名。

  2. 为Python 3.12安装pip

    sudo python3.12 get-pip.py

    这个命令会为Python 3.12安装对应的pipsetuptoolswheel。安装完成后,pip通常会被安装到/usr/local/bin/pip3.12

  3. 同样为pip3设置alternatives(可选但建议):

    sudo update-alternatives --install /usr/bin/pip3 pip3 /usr/local/bin/pip3.12 2

    如果之前有pip3(对应python3.6),可以用--config查看和切换。

验证安装:

pip3.12 --version # 或 pip3 --version

输出应显示pip 23.x.x from ... (python 3.12)

至此,Python 3.12和pip的核心安装与配置在5分钟内基本完成。但要让其真正好用,还需要进行一些优化。

4. 深度优化与环境配置

安装成功只是第一步,一个高效、稳定的Python开发环境还需要以下配置。

4.1 配置pip国内镜像源以加速安装

从PyPI官方源下载包速度可能很慢。将源替换为国内镜像能极大提升体验。清华源和中科大源都是很好的选择。

为当前用户配置全局镜像源

mkdir -p ~/.pip cat > ~/.pip/pip.conf << EOF [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn EOF
  • mkdir -p:如果目录不存在则创建。
  • cat > file << EOF ... EOF:一种将多行内容写入文件的方法。
  • trusted-host:告诉pip信任这个主机,否则在使用HTTP时会报警告。

为sudo权限下的pip也配置镜像源(当需要sudo pip install时,虽然不推荐):

sudo mkdir -p /etc/pip sudo tee /etc/pip/pip.conf << EOF [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn EOF

4.2 善用Python虚拟环境(venv)

永远记住:尽量避免使用sudo pip install在系统全局安装Python包。这可能导致包版本与系统包管理器apt安装的软件产生冲突,引发难以排查的依赖问题。

Python 3.12自带了venv模块。为每个项目创建独立的虚拟环境是最佳实践。

# 进入你的项目目录 cd my_project # 创建虚拟环境,环境目录名为‘venv’ python3 -m venv venv # 激活虚拟环境 source venv/bin/activate

激活后,终端提示符前会出现(venv)字样。此时所有pip install操作都仅作用于该环境内,与系统完全隔离。安装包速度飞快,且不会影响他人或其他项目。

退出虚拟环境使用命令:deactivate

4.3 处理潜在的SSL/TLS证书问题

在某些严格的内网环境或旧版系统上,pip安装时可能会遇到SSL证书验证错误(如CERTIFICATE_VERIFY_FAILED)。网络热词中提到的“pip 永久禁用ssl”是一种极其不安全的做法,绝对不要使用--trusted-host或修改代码库的方式永久禁用SSL验证。

正确的解决思路是:

  1. 更新系统的CA证书包
    sudo apt update sudo apt install --reinstall ca-certificates
  2. 如果是因为自定义证书或代理,请将正确的证书文件路径设置给pip或系统环境变量SSL_CERT_FILE
  3. 临时绕过(仅用于测试):如果只是临时安装一个确定安全的包,可以谨慎使用pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org some-package,但绝不能将其写入永久配置。

5. 疑难杂症与故障排除实录

在实际操作中,你可能会遇到以下问题。这里记录了我的排查过程和解决方案。

5.1 问题:执行python3pip3命令报错“ModuleNotFoundError: No module named ‘apt_pkg’”

场景:在成功安装Python 3.12并切换update-alternatives后,运行某些系统命令或apt相关操作时报错。

根因:一些系统工具(如apt的某些Python模块)是使用特定Python 3版本(如3.6)编译的。当python3命令指向3.12时,它们可能因模块ABI不兼容而无法加载。

解决方案

  1. 最根本的方法是不要改变系统默认的/usr/bin/python3的指向。我们之前使用update-alternatives,实际上是在管理/usr/bin/python3这个软链接。对于Ubuntu 18.04,更安全的做法是保持系统python3指向3.6,而我们只在需要时显式使用python3.12
  2. 如果你已经更改并出现问题,可以将其改回:
    sudo update-alternatives --config python3
    然后选择系统自带的Python 3.6对应的编号。
  3. 对于日常开发,坚持使用虚拟环境。在虚拟环境中,pythonpip命令自然指向你创建环境时使用的解释器版本(如3.12),与系统全局命令无关。

5.2 问题:使用pip安装包时速度极慢,甚至超时

场景:即使配置了镜像源,在某些网络环境下下载特定包或依赖时仍非常慢。

排查与解决

  1. 检查镜像源是否生效pip config list查看当前配置。
  2. 尝试其他国内源:清华、阿里、腾讯、华为云都提供镜像服务。在pip.conf中替换index-url即可。
  3. 使用pip的离线下载与安装功能
    • 在一台网络好的机器上,下载包及其依赖:pip download -d ./packages some-package
    • packages文件夹拷贝到目标机器,离线安装:pip install --no-index --find-links=./packages some-package
  4. 检查是否有HTTP/HTTPS代理干扰:执行env | grep -i proxy,如果有无用的代理设置,可以临时取消:unset http_proxy https_proxy

5.3 问题:安装某些包(如psycopg2mysqlclient)编译失败

场景pip install过程中出现大段红色错误输出,提示gcc编译错误,缺少Python.hpg_config等。

根因:这些包是含有C扩展的Python包,编译需要对应的开发头文件和库。

解决方案:安装必要的系统开发包。

# 基础编译环境 sudo apt install -y build-essential # Python开发头文件(对应你使用的Python版本,此处以3.12为例) sudo apt install -y python3.12-dev # 常见数据库客户端开发包 sudo apt install -y libpq-dev libmysqlclient-dev # 其他常见库 sudo apt install -y libssl-dev libffi-dev libxml2-dev libxslt1-dev

安装这些-dev包后,通常就能成功编译安装那些依赖C扩展的Python包了。

5.4 关于网络热词中“vscode 版本太高远程不到ubuntu18.04”的延伸

这个热搜词反映了一个常见问题:新版VS Code的Remote-SSH扩展对老旧系统GLIBC库版本有要求。虽然与Python升级不直接相关,但思路相通——在旧系统上使用新软件可能存在底层库依赖冲突。

给你的启示:在像Ubuntu 18.04这样的长期支持版(LTS)上,大规模升级核心开发工具链(如Python、Node.js)时,采用我们这种“并行安装、软链接管理”的方案,远比直接升级系统自带的软件包更为安全可控。它为旧系统提供了运行新应用的能力,同时最大程度保留了系统本身的稳定性。

6. 升级后的验证与日常使用指南

完成所有步骤后,让我们系统地验证一下环境,并梳理日常最佳实践。

6.1 环境验证清单

执行以下命令,检查各项配置是否如预期工作:

# 1. 检查Python 3.12是否可执行 python3.12 --version # 2. 检查python3命令当前指向(根据你的alternatives设置) python3 --version # 3. 检查pip是否与Python 3.12关联 pip3.12 --version # 或 pip3 --version # 输出应明确显示‘python 3.12’ # 4. 测试虚拟环境创建与激活 cd /tmp python3.12 -m venv test_venv source test_venv/bin/activate python --version # 应显示 3.12.x pip list # 应只显示基础的pip, setuptools, wheel deactivate rm -rf test_venv # 5. 测试pip安装(从国内源安装一个小包,如requests) pip3.12 install --upgrade requests python3.12 -c "import requests; print(requests.__version__)"

6.2 日常使用工作流建议

为了保持环境整洁,避免依赖地狱,我强烈建议你遵循以下工作流:

  1. 为每个项目创建独立虚拟环境:这是黄金法则。使用python3.12 -m venv .venv
  2. 使用requirements.txt管理依赖:在项目根目录,激活虚拟环境后,用pip freeze > requirements.txt导出依赖。他人或你在新环境部署时,只需pip install -r requirements.txt
  3. 区分“开发依赖”与“生产依赖”:可以使用requirements-dev.txt来存放像pytestblack这类只在开发时需要的工具。
  4. 谨慎使用系统级pip:如果确实需要全局安装某个命令行工具(如youtube-dlhttpie),可以考虑使用pipx工具,它能自动为每个全局安装的CLI工具创建独立的虚拟环境,实现隔离。安装pipxpython3.12 -m pip install --user pipx,然后pipx ensurepath

6.3 如何安全地清理

如果你未来想移除Python 3.12:

  1. 移除alternatives配置
    sudo update-alternatives --remove python3 /usr/bin/python3.12 sudo update-alternatives --remove pip3 /usr/local/bin/pip3.12
  2. 卸载通过PPA安装的包
    sudo apt remove --purge python3.12 python3.12-venv python3.12-distutils
  3. 删除通过get-pip.py安装的pip相关文件(通常位于/usr/local/bin//usr/local/lib/python3.12/下,但手动删除需谨慎)。更安全的方法是重新运行get-pip.py并带上卸载参数(如果支持),或者直接删除相关文件:
    sudo rm -f /usr/local/bin/pip3.12 /usr/local/bin/pip3 sudo rm -rf /usr/local/lib/python3.12/dist-packages/pip /usr/local/lib/python3.12/dist-packages/pip-*.dist-info
  4. 移除PPA源(可选)
    sudo add-apt-repository --remove ppa:deadsnakes/ppa sudo apt update

经过以上步骤,你已经在Ubuntu 18.04上成功搭建了一个与系统隔离、功能完整的Python 3.12开发环境。整个过程的核心在于理解系统包管理、多版本共存以及虚拟环境隔离的理念。记住,在Linux系统上,尤其是作为开发主力机,保持系统Python环境的纯净至关重要,任何用户级的开发都尽量约束在虚拟环境之内进行。这样,无论Python版本如何迭代,你的系统基础服务都能稳如磐石。