需求

Ubuntu 18.04 默认的Python3版本为Python3.6,我们想将其升级为Python3.8.

⚠️警告

Python3升级后会破坏原先Ubuntu系统上的某些Python3依赖,升级前请务必考虑清楚。遇到问题后,可以参考文末方法解决。

达成的效果

  • 以所有普通用户或root用户,在终端或脚本中运行python3时,会运行python3.8解释器
  • 以所有普通用户或root用户,在终端或脚本中运行pip或pip3时,会运行pip3.8包管理器
  • 升级只会影响系统中的python3、pip3与pip命令。
  • 升级不会影响到系统中的python命令与python2命令,也不会影响pip2命令。

升级步骤

允许使用更多Apt官方源

某些定制化的Ubuntu18.04系统中,只允许用户(使用Apt)安装来自main仓库的软件包。
但是Python3.8位于universe仓库,我们需要将其添加至Apt源。

安装add-apt-repository工具,这是一个将新仓库添加进Apt源的工具

sudo apt install software-properties-common

将universe仓库添加进Apt源

sudo add-apt-repository universe
sudo apt update

源更新完毕后,我们就可以通过apt来安装Python3.8了。

安装Python3.8与相关库、头文件

安装Python3.8解释器

sudo apt install python3.8

安装相关开发库与头文件

sudo apt install libpython3.8-dev

将Python3.8设置为默认Python3解释器

参考:https://unix.stackexchange.com/a/410851

将刚刚安装的Python3.8解释器添加到系统Python3解释器的备选替代中

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1

将系统原装的Python3.6解释器添加到系统Python3解释器的备选替代中

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2

展示系统Python3解释器所有可选的版本

sudo update-alternatives --config python3

输入数字后回车,将系统默认的Python3解释器设置为你需要的Python3.8版本。

  • 执行python3 --version命令,此时应当输出Python3.8的版本信息。
  • 执行sudo python3 --version命令,此时应当输出Python3.8的版本信息。

重启后测试一下sudo apt install命令是否正常工作。

安装Pip3.8包管理器

目前笔者没有找到包含python3.8-pip的Apt源。
Python Packaging Authority(pypa)组织提供了安装Pip的离线脚本,用户将脚本下载后,可以在本地运行脚本安装Pip。

切换到root用户,我们希望进行系统级别安装

su -l

下载pip安装脚本,安装Pip3.8包管理器

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

安装完毕后切换回普通用户

  • 执行pip3 --version命令,此时应当输出适用于Python3.8的包管理器信息。
  • 执行sudo pip3 --version命令,此时应当输出适用于Python3.8的包管理器信息。

问题解决

netplan 工具执行失败

netplan是Ubuntu上的网络管理前端,依赖于Python3解释器。我们升级Python3解释器后,在执行netplan命令后可能会出现如下错误

Traceback (most recent call last): File “/usr/sbin/netplan”, line
23, in
netplan.main() File “/usr/share/netplan/netplan/cli/core.py”, line 42, in main
self.parse_args() File “/usr/share/netplan/netplan/cli/core.py”, line 35, in parse_args
import netplan.cli.commands File “/usr/share/netplan/netplan/cli/commands/init.py”, line 18, in

from netplan.cli.commands.apply import NetplanApply File “/usr/share/netplan/netplan/cli/commands/apply.py”, line 29, in

import netifaces ModuleNotFoundError: No module named ‘netifaces’

错误原因:找不到属于Python3.8的netifaces模块。

su -l
pip3 install --ignore-installed netifaces pyyaml
exit

gnome-terminal 图形终端模拟器打开失败

在图形界面点击终端图标,报错信息:

Failed to execute default Terminal Emulator. Input/output error.

用开启X11转发的SSH终端单独运行gnome-terminal命令,报错信息:

ImportError: cannot import name ‘_gi’ from partially initialized module ‘gi’ (most likely due to a circular import)

错误原因:找不到属于Python3.8的gi模块。
解决方法:https://stackoverflow.com/a/60352723/15283141

su -l
apt install pkg-config libcairo2-dev libgirepository1.0-dev
pip3.8 install --ignore-installed PyGObject
exit