多版本Python安装pip及pip版本管理终极教程

多版本Python安装pip及pip版本管理终极教程

有时候电脑或服务器里需要安装多个版本的Python,比如Python2.7、Python3.5、Python3.6。同时存在多个版本的Python,如何安装对应的pip成为一个头疼的问题,本文从原理入手,详解如何安装对应Python版本的pip,当然也适合单一版本Python的pip的安装。

本文所用系统环境:Ubuntu16。

pip,说到底只是Python的一个包,平时我们安装Python包都是用pip安装的,那么pip怎么安装?最简单的方法,可以使用下面命令:

sudo apt-get install python-pip

sudo apt-get install python3-pip

那么如果要为Python3.5和Python3.6同时安装pip这种方法就不行了,网上有很多方法,小编也是看的头晕眼花,那么下面小编介绍一种方法来从根本上解决多版本Python安装对应pip的问题,以及对pip对应Python版本进行管理。

第一步,安装pip包

上面说了,pip说到底就是Python的一个包。所以首先我们就要先安装这个包,用下面两行命令来安装:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

如果你要为Python3.6安装pip,就把上面第二行命令换成:

python3.6 get-pip.py

同理,为Python3.5安装则换成相应版本。然后查看一下是否安装成功:

pip -V

显示下面说明安装成功。

pip 10.0.1 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

其实到这已经成功安装指定版本Python对应的pip,如果只为安装pip则下一步可以不看。

第二步,管理pip对应的Python版本

我们发现,每次安装pip,它都会把默认pip对应的Python修改,导致pip对应版本混乱。首先用下面命令查看pip对应的Python版本:

pip -V
pip2 -V
pip3 -V

可能pip对应的是Python3.6,pip3对应的也是Python3.6。如果想让pip对应Python2.7,pip3对应Python3.5怎么办呢?

转到下面目录:

cd /usr/local/bin

然后ls一下可能会发现好多pip文件,比如pip、pip2、pip2.7、pip3、pip3.5等等。使用一下命令:

file pip

输出:pip: Python script, ASCII text executable。发现pip其实是个Python脚本。于是我们用vim打开它:

#!/usr/bin/python3.6

# -*- coding: utf-8 -*-
import re
import sys

from pip._internal import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

看第一行,第一行指定了这个脚本对应的python版本,如果想把pip对应的python版本改为2.7的,只需修改python3.6为python2.7即可。修改保存后执行:

pip -V

若出现下面提示

Traceback (most recent call last):
  File "/usr/local/bin/pip", line 7, in <module>
    from pip._internal import main
ImportError: No module named _internal

则说明修改后的python(上文修改的为python2.7)没有安装pip包,使用第一步的方法安装pip包即可。

同理,如果想新建一个,比如新建一个pip3.6,touch pip3.6,然后把上面内容粘进去即可,其它版本也同理,最后别忘了为新建的文件加上可执行权限。

但是,不同版本pip对应的这个脚本文件的内容不同,上面显示的是pip 10.0版本的,其它版本的脚本文件内容可能与之不同。直接改这个脚本文件来修改pip对应的python版本的前提是:当前脚本文件对应的Python版本与要修改对应的Python版本的pip包版本最好一致,不一致很可能出错。最简单的解决办法是都升级为最新的pip版本。

到此为止,我们可以对pip为所欲为了。

编辑于 2018-05-30