Ubuntu18.04兼容Python2.7、Python3.6、Python3.8以及pip、pip2、pip3問題


此為記錄我重裝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

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、pip、pip2、pip3

解決兼容問題

  我的想法是:Python2.7、Python3.6、Python3.8之間可以隨便切換,而且pip和pip3會動態指向我切換的Python版本上(pip2就讓他指向Python2.7吧)

第一步:解決Python版本切換問題

目前網上已經有很好的教程了,使用update-alternatives 來為整個系統更改Python 版本的方法更好。

找到各個Python的路徑,使用which命令

which python2.7
which python3.6
which 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文件,包括pip、pip2、pip3、pip3.8(Python3.8的)

輸入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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM