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的优先级高,此时系统中的指向关系如图:
这样,系统默认的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 区别.