Ubuntu 16.04可以通过添加PPA库来安装python 3.7,也可以通过源码编译安装,CSDN大佬们早就出了一大堆有关的帖子,此处不谈。
升级到Ubuntu 18.04,apt源自带了python 3.7,直接通过sudo apt-get install python 3.7安装即可
但,问题来了!!
不管是以前从python 3.5升级到python 3.6,还是从3.6到3.7,或者直接从3.5到3.7,升级之后基本上会遇到下面几个问题:
1. 命令行输python 3打开的还是python 3.6
这个单纯的时因为没有把python 3.7链接过去,需要更新python 3.7为python3的解释器
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 50
sudo update-alternatives --config python3
# 此处手动选择python3或者Ubuntu会设置python 3.7为自动模式
2. 经过第一步后terminal打不开了
真的只是因为python 3.7的原因!
terminal来自于每个Ubuntu发行版自带的gnome-terminal脚本,位置在/usr/bin/gnome-terminal,通过vim或者gedit查看可以看到
#! /usr/bin/python3
就在此处,仅仅修改上面一句为
#! /usr/bin/python3.6
就能使terminal回归。
terminal在开发阶段使用的是自带的python 3.6/3.5解释器,当升级到python 3.7之后,其中的一些内建函数或者语法发生了变化,导致terminal打不开了,一般情况下可以通过
sudo apt-get install gnome-terminal
更新terminal来解决问题,有时候重新安装并没有解决问题,是因为当前Ubuntu版本对应的源里面没有更新版的terminal,可以使用上述修改解释器的方式临时解决。
3. 惊了!apt_pkg找不见了
ImportError: No module named 'apt_pkg'
该报错会发生在执行sudo apt-get update / install,pip install,import modules时。
apt_pkg包来自于python_apt或python3_apt,同2,Ubuntu发行版对应了一个python 3.x的版本,而不是更高的版本,在很大程度上可以说明更高版本的python会带来问题,这里的问题就是因为dist包中的apt_pkg.cython.*.so库版本无法对应。
如果是python 3.5升级了python 3.6,或者是从低版本升级到3.5时,可以使用
sudo apt-get install python3-apt --reinstall
解决,在常规的Ubuntu源中,可能有对应了python 3.5和3.6的apt_pkg的so库,可能可以解决,但是针对如此多的Ubuntu版本(即使同为16.04可能对应了不同的子版本),或许真的运气很不好,只能通过下述方法进行尝试。
python 3.7临时解决apt_pkg,适用于3.6和3.5.
apt_pkg的cython包在
cd /usr/lib/python3/dist-packages
目录下,ls过后可以找到apt_get.cython-(34m, 35m, 36m)-x86_64-linux-gnu.so文件,这里的括号是指可能存在的版本,即可能有34或35或36,假设我们拥有了apt_get.cython-36m-x86_64-linux-gnu.so,目标python版本是3.7
ln -s apt_get.cython-{36m,37m}-x86_64-linux-gnu.so
# {36m,37m}是一种ln -s的简化写法,从36m链接到37m但其余字符不变
ls后可以看到有了目标的apt_get.cython-37m-x86_64-linux-gnu.so库文件,此时执行sudo apt-get update不会再报出apt_pkg找不到的问题,继而可以
sudo apt-get install python3-pip
这也只是一种临时解决方案,本着“能用就行”的原则,够了。
按照Ubuntu 16.04到18.04官方源变化的趋势,官方肯定会在下一个大版本中放出更优雅的解决方案。
emmmmmmm,愚人拙见,还请指正。