此為記錄我重裝Ubuntu後安裝Python的過程
安裝Python3.8
其他系統安裝: CentOS 7上安裝Python 3.9
目前Ubuntu自帶的Python版本為3.6,但官方都出3.8了,能不試一下新的功能嗎?
第一步:下載下傳Python3.8的源碼
點選這裡打開網址
選擇下載下傳tgz包(“Download Gzipped source tarball ”),解壓
第二步:更新包清單并安裝建構Python源所需的包
輸入這三個指令:
$sudo apt update
$sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
$sudo apt-get install make
第三步:安裝Python3.8
解壓
tgz
包, 并
cd
到Python解壓目錄,然後輸入以下指令
sudo ./configure --enable-optimizations
sudo make altinstall
到這裡Python3.8已經安裝完成,但是隻能輸入
python3.8
打開,這裡等到下面一并解決
安裝
pip
和
pip3
, 直接輸入下面兩行代碼,安裝
$sudo apt install python-pip
$sudo apt install python3-pip
此時,ubuntu中已經有了:
python2.7
、
python3.6
python3.8
pip
pip2
pip3
解決相容問題
我的想法是:
python
指令是可以動态切換
Python2.7
Python3.6
Python3.8
的,而且
pip
pip3
會動态指向我切換的python版本上(pip2就讓他指向Python2.7吧)
第一步:解決Python版本切換問題
目前網上已經有很好的教程了,使用
update-alternatives
指令來為整個系統更改python 版本的方法更好。
第一步: 找到各個Python的路徑,使用which指令
$which python2.7
/usr/bin/python2.7
$which python3.6
/usr/bin/python3.6
$which python3.8
/usr/local/bin/python3.8
第二步: 記錄好他們所在路徑,我這裡是
/usr/bin/python2.7
/usr/bin/python3.6
/usr/local/bin/python3.8
第三步: 重點,使用
update-alternatives
指令
$sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
$sudo update-alternatives --install /usr/bin/python python /usr/local/bin/python3.8 3
這裡的最後一個參數是優先級,數越大越高,倒數第二個參數是各個版本Python所在位置,即我們上一步記錄的東西
檢驗是否成功, 輸入:
$sudo update-alternatives --config python
選擇并切換Python版本,至此,Python版本相容性問題已經解決
第二步:解決pip、pip2、pip3指向問題
當我切換到python3.8輸入
pip -V
,檢視pip指向哪裡之時,會報錯
“from pip import main ImportError: cannot import name 'main'
聽網上說,主要是由于ubuntu更新pip的版本後導緻的
沒有這個問題的跳過即可
我的做法是修改pip檔案: 結合兩個pip檔案, 然後作python版本判斷, 執行對應代碼即可
注:一定要備份pip檔案,包括pip、pip2、pip3、pip3.8(Python3.8的)
輸入
echo $PATH
,可以看到環境變量:
$echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
不巧的是
pip
pip3
在
/usr/local/bin
目錄下,而
/usr/bin
目錄下也有
pip
pip3
,由優先級知道輸入
pip
指令會優先執行
/usr/local/bin
目錄下的。
是以我這裡修改的是
/usr/local/bin
下的
pip
pip3
pip3.8
/usr/bin
pip2
,假如想改
/usr/bin
pip
pip3
的話可以直接
cp
過去(注意先備份)
下面是修改的代碼,可以直接複制粘貼過去
pip
#!/usr/bin/python
# GENERATED BY DEBIAN
import sys
# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
if sys.version_info.major == 3 and sys.version_info.minor == 8:
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())
else:
from pip import main
if __name__ == '__main__':
sys.exit(main())
pip2
#!/usr/bin/python2.7
# GENERATED BY DEBIAN
import sys
# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import main
if __name__ == '__main__':
sys.exit(main())
pip3和pip3.8
#!/usr/bin/python
# -*- coding:utf-8 -*-
# GENERATED BY DEBIAN
import sys
import os
# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
if sys.version_info.major == 3:
if sys.version_info.minor == 8:
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())
else:
from pip import main
if __name__ == '__main__':
sys.exit(main())
else:
msg = "目前Python版本為Python%s.%s,不能使用pip3!" % (sys.version_info.major, sys.version_info.minor)
os.system("echo %s" % msg)
os.system("""echo "請使用'update-alternatives --config python' 切換Python版本" """)
參考資料:
https://www.jb51.net/article/163112.htm
https://blog.csdn.net/qq_38522539/article/details/80678412
本文來自部落格園,作者:403·Forbidden,轉載請注明原文連結:https://www.cnblogs.com/lczmx/p/12428041.html