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,愚人拙見,還請指正。