ubuntu16.04,卸载系统自带的python3.5引发了一宗惨案,好在最终完美解决

32 篇文章 1 订阅

!如果着急解决问题,建议直接跳到【解决问题】章节

背景

由于项目需求,在调试代码的时候发现一个由python版本导致的错误(Ubuntu16.04 python3.5m/pybind11/detail/internals.h:110:34: error: ‘nullptr),同事用的python3.6没问题,而我虚拟机上只装了python2.7和python3.5,所以第一反应是安装python3.6。顺便附一下python3.6安装过程(尝试用源码编译,但会报错,没深究)

安装python3.6

Ubuntu16.04的软件仓库(源)中python的最高版本就是python3.5,所以无法直接用apt来安装

#方法一
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6
#方法二
sudo add-apt-repository ppa:jonathonf/python-3.6
sudo apt-get update
sudo apt-get install python3.6
设置python优先级
#查看python版本的优先级
sudo update-alternatives --config python
#若没有设置优先级,则会显示如下error
update-alternatives: error: no alternatives for python3 

#方法一:通过update-alternatives来设置默认python版本, 最后的参数1,2是优先级,数字越大优先级越高,比如经过如下设置后,在终端输入python,显示的就是3.6的版本了
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
#方法二
sudo update-alternatives  --set python /usr/bin/python3.6
设置python关联版本

在终端输入python,会默认使用你设置的版本,但是如果你想在终端输入python时显示2.7的版本,输入python3时才是你想要的版本时,你就需要关联一下版本。有时候安装了python3版本,但是在终端输入python3时却提示

bash: /usr/bin/python3: No such file or directory

则需要进行下面操作

#打开.bashrc
vim ~/.bashrc
#在.bashrc中添加
alias python3=python3.6
or
alias python3='/usr/bin/python3.6'
#保存并退出文件编辑,使配置生效
source ~/.bashrc
为python安装对应的pip
#方法一
curl https://bootstrap.pypa.io/ez_setup.py -o - | python3.6 && python3.6 -m easy_install pip
#方法二
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" python3 get-pip.py --user

如果pip3需要升级,但用常用方法升不了级时,可参考这篇帖子【Ubuntu16.04 升级pip问题】you are using pip version 8.1.1, however version 20.0.2 is available.

卸载python3.5

言归正传,在安装了python3.6,并且设置完优先级和关联版本后,再次编译还是报一样的问题,还是去找了python3.5下面的库,应该是即使装了python3.6,但并没有创建软链接什么的造成的。当时无知,就决定卸载python3.5,想着3.5也是后面才装的,系统默认安装的是python2.7。

卸载命令

sudo apt-get remove python3.5
# 卸载 python3.5 及其依赖
sudo apt-get remove --auto-remove python3.5

悲剧发生

然后悲剧发生了,我把终端关闭后就再也无法打开了(terminator和gnome-terminal都打不开),原本在任务行添加的terminator和gnome-terminal都没了。重启虚拟机,菜单栏、任务栏都没了,就只能看到壁纸了。alt + ctrl + t 也不能打开终端,好在能进字符界面,也能通过ssh远程连接。

解决问题

最开始怀疑是图形界面的服务出了问题,于是决定重启lightdm服务试一试

sudo service lightdm restart

事实证明问题不在这,重启服务后跟刚重启虚拟机的时候效果是一样的。

因为是卸载python3.5造成的,所以决定重新安装python3.5,Ubuntu16.04的源有包含3.5的版本,所以安装很简单

sudo apt-get install python3
重新安装Ubuntu桌面

安装完,reboot,无效。于是决定重新安装gnome桌面

sudo apt-get -f install ubuntu-minimal ubuntu-standard ubuntu-desktop
#如果有问题,请先执行下面命令
sudo apt install -f

然后reboot,菜单栏和任务栏回来了!但终端还是不能通过快捷键起来,双击图标也不能启动,能用的终端只有xterm,在xterm端输入gnome-terminal 报错

Traceback (most recent call last):
File “/usr/bin/gnome-terminal”, line 9, in 
from gi.repository import GLib, Gio
ModuleNotFoundError: No module named 'gi’
修改gi库名及安装gi

这错误之前没见过,遂百度之,得到解决方案(这一步是需要的,虽然不一定能立马解决问题

cd /usr/lib/python3/dist-packages/gi/

sudo mv _gi_cairo.cpython-35m-x86_64-linux-gnu.so  _gi_cairo.cpython-37m-x86_64-linux-gnu.so
sudo mv _gi.cpython-35m-x86_64-linux-gnu.so _gi.cpython-37m-x86_64-linux-gnu.so

#安装python-gi
sudo apt-get install python-gi

看的那篇帖子只说了这么解决,但没说为什么,但事实上我用这方法也并不能解决,后面才了解到为什么要这么改:

下面的35 改成36 表示从py3.5 改到py3.6,如果安装的是3.7就改成37

更改gnome-terminal文件

接下来,需要修改gnome-terminal文件以及terminator文件(我安装了terminator)关于terminator,可参考这篇博客Ubuntu下的终端设置(分清Terminal与Terminator)-Terminator个性化主题设置

sudo vim /usr/bin/gnome-terminal
sudo vim /usr/bin/terminator
#将第一行改为#!/usr/bin/python2
成了!

至此,两个终端都可以正常打开了,重新添加到任务栏也没问题了,用快捷键打开也ok了。

另外,除了重新安装了一下依赖于python3的软件后暂时没遇到其他后续影响。如果有后续影响,将在本篇博客下更新。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值