目录

Ubuntu-18.04-升级-Python3以Python3.8为例

Ubuntu 18.04 升级 Python3;以Python3.8为例

需求

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

⚠️警告

Python3升级后会 破坏原先Ubuntu系统上的某些Python3依赖 ,升级前请 务必考虑清楚

  • 您的需求能否通过 Virtualenv / Conda 这类 虚拟环境 解决?
  • 您是否一定要 全局安装 新版本的Python3?是否可以 从源码构建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解释器

参考:

将刚刚安装的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