ubuntu16.04安装python3.9之后部分系统软件打不开的问题(软链接;/usr/bin 与 /usr/local/bin 的区别;update-alternatives原理)

  • Post author:
  • Post category:python

ubuntu16.04安装python3.9之后部分系统软件打不开的问题(软链接;/usr/bin 与 /usr/local/bin 的区别;update-alternatives原理)

问题描述

如果你遇到了以下问题:
1.状态栏出现红色圆圈警告并显示“检查更新的时候发生了错误”;
2.部分系统软件无法打开
请继续阅读
在这里插入图片描述

错误原因

按照教程安装python3.9之后更改了默认的python版本导致系统软件出错,红圈警告是系统的软件更新器出了问题,这个问题不容忽视。

相关原理

软链接原理

软链接类似于windows的快捷方式,指令格式为

#sudo ln -s /目录A/文件c /目录B/快捷方式d。例如:
 sudo ln -s /usr/local/bin/python3.9 /usr/bin/python3

效果是 在目录B下创建一个快捷方式d,指向目录A下的文件c,访问d相当于访问c

/usr/bin 与 /usr/local/bin 的区别

/usr/bin 系统预装的一些可执行程序,随系统升级会改变

/usr/local/bin 用户自己安装的可执行程序,不受系统升级影响,用户编译安装软件时,一般放到/usr/local目录下

如果两个目录含有相同的可执行程序,通过查看PATH,比较优先级,一般/usr/local/bin的优先级大于/usr/bin。也就是说,如果这两个文件夹里有同名的程序,则优先使用/usr/local/bin里的程序

软件版本管理命令update-alternatives原理

命令格式

update-alternatives --install link name path priority

例如:

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

–install:向update-alternatives注册服务名
link:注册最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链。
name:服务名,个人理解为省略写法,最终会在/etc/alternatives文件夹下生成一个名为name的快捷方式(软链接)
path:被管理的命令绝对路径。也就是之前软链接的最终指向。
priority:优先级,数字越大优先级越高

link-name-path的指向关系如图
在这里插入图片描述

在这里插入图片描述
使用时,调用的是link,最后实际执行命令的是path。

如果用户安装了除python2.7和python3.5之外其他版本的python,如python3.9,则会在/usr/bin/目录下生成python3.9的快捷方式(一般教程里都会有这一步),在文件夹中即可找到

sudo ln -s /usr/local/bin/python3.9 /usr/bin/python3.9

在这里插入图片描述

解决办法

首先,系统自带的python2.7和python3.5绝对不可以删,否则后患无穷。然后确定3.9的安装位置

which python3.9
#结果为/usr/local/bin/python3.9

然后建立python3.9在/usr/bin中的快捷方式(/usr/local/bin/python3.9为上一步的结果)

sudo ln -s /usr/local/bin/python3.9 /usr/bin/python3.9

此时在/usr/bin中会有python2.7,python3.5,python3.9的快捷方式,然后执行:

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 20
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 10

这样的结果是python3.9比python3.5的优先级高,再执行:

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 150
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100

这样的结果是python2比python3的优先级高,此时系统中的指向关系如图:
Alt这样,系统默认的python版本就改为了python2.7,由于python3.5比python3.9优先级高,所以默认的python3版本为python3.5。通过以下命令查看:

python -V
python3 -V
#结果:Python 2.7.12/Python 3.5.2

如果想随时更改默认python版本,可以通过以下命令修改:

sudo update-alternatives --config python

在这里插入图片描述
此时再点击红色圆圈,随便点击一个可点选项,就会发现软件更新器已经恢复了工作。

还有一种解决办法,就是在需要执行的python文件上添加解释器版本声明,链接.

参考

参考1-/usr/bin 和/usr/local/bin 区别.

参考2-linux软件版本管理命令update-alternatives使用详解.

参考3-ubuntu系统升级Python3.5—>3.9.

参考4-ubuntu下切换默认的python版本.


版权声明:本文为qq_21570025原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。