天天看点

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

解压

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