作者:洪宸
链接:https://www.zhihu.com/question/21653286/answer/97950092
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一步步教你打造Python 和 Python3 并存的环境:为了回答这个问题,特意跑到一台 CentOS 6.5 上装了一个 Python3(手头没有 Ubuntu 的环境),然后又装了一个 pip,通过ln创建连接、alias创建别名这些操作,证明Python2 和 Python3 还是可以完美并存的。题主的问题不在于能不能并存,而在于用默认的 pip install 命令给Python3 安装这个做法本身就是错误的,下面是我的解决方案:环境上之前已经有了 Python 和 pip,
python --version
>>> Python 2.7.9
pip --version
>>> pip 8.1.1 from /usr/local/lib/python2.7/site-packages (python 2.7)
安装了 Python3 (路径 /usr/local/python3/bin/python3)之后,创建一个软链接 /usr/bin/python3, # ln -s /usr/local/python3/bin/python3 /usr/bin/python3
# which python3
/usr/bin/python3
# ll /usr/bin/python3
lrwxrwxrwx. 1 root root 30 4月 28 20:46 /usr/bin/python3 -> /usr/local/python3/bin/python3
这样就可以直接使用 python3 命令了。# python3 --version
Python 3.5.1
接着我用 Python3 装了个pip(路径 /usr/local/python3/bin/pip3)。之前有人说用pip3升级又会变成pip,所以我开始装的是一个1.5.4版本的。# which pip3
/usr/bin/which: no pip3 in (/usr/lib/java/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
# pip3 --version
pip 1.5.4 from /usr/local/python3/lib/python3.5/site-packages/pip-1.5.4-py3.5.egg (python 3.5)
那我现在就开始用两个pip进行安装啦,就安装那个 requests 包吧:# python
Python 2.7.9 (default, Dec 1 2015, 14:05:26)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named requests
>>>
包不存在噢~# pip install requestsCollecting requests Downloading requests-2.9.1-py2.py3-none-any.whl (501kB) 100% |████████████████████████████████| 501kB 945kB/sInstalling collected packages: requestsSuccessfully installed requests-2.9.1# python
Python 2.7.9 (default, Dec 1 2015, 14:05:26)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.get('http://zhihu.com')
<Response [200]>
>>>
Python2 下是没问题的,接下来再看 Python3:# python3
Python 3.5.1 (default, Apr 28 2016, 20:38:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'requests'
>>>
也是不存在的。# pip3 install requests
Collecting requests
Using cached requests-2.9.1-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.9.1
# python3
Python 3.5.1 (default, Apr 28 2016, 20:38:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.get('http://zhihu.com')
<Response [200]>
>>>
bingo~好,我再升级一下 pip3:# pip3 install --upgrade pip
Downloading/unpacking pip from https://pypi.python.org/packages/31/6a/0f19a7edef6c8e5065f4346137cc2a08e22e141942d66af2e1e72d851462/pip-8.1.1-py2.py3-none-any.whl#md5=22db7b6a517a09c29d54a76650f170eb
Downloading pip-8.1.1-py2.py3-none-any.whl (1.2MB): 1.2MB downloaded
Installing collected packages: pip
Found existing installation: pip 1.5.4
Uninstalling pip:
Successfully uninstalled pip
Successfully installed pip
Cleaning up...
# pip3 --version
pip 8.1.1 from /usr/local/python3/lib/python3.5/site-packages (python 3.5)
完美升级,并且可用。现在再说为什么题主使用 pip install 想给 Python3 安装这个做法是错的:看我上面执行了两个 pip --version 命令和 pip3 --version 命令,明确的显示了他们安装包的 site-packages 路径,你默认的 pip 是 Python2 下的,安装的包当然安装不到 Python3 下面。我为什么要在 /usr/bin 下创建一个 pip3 链接,因为同一个目录下,只能存在一个 pip , 已经存在了指向 Python2 的 pip,新来的 pip 就不能再用这个名字,否则覆盖就造成原来 Python2 的 pip 不可用。如何解决同名命令的多版本存在的问题呢? 参考我下面的做法:python3/pip3 带个数字的命令总觉得不正统,但是不带数字的 python/pip 已经被 Python2 给占用了又想保留他们,那我该怎么办呢? 这个时候就轮到伟大的 alias 上场了:# alias pip=/usr/local/python3/bin/pip3
# pip --version
pip 8.1.1 from /usr/local/python3/lib/python3.5/site-packages (python 3.5)
此时 再用 pip install 安装的库都将安装到 Python3 的路径下,如果想用 Python2 的 pip , 只需要执行一个 unalias pip 就好了:# unalias pip
# pip --version
pip 8.1.1 from /usr/local/lib/python2.7/site-packages (python 2.7)
同理,可以把这个用到 python 命令上。alias 命令可以写到你的shrc环境变量文件里,这样就不用每次都敲这么一长串命令了。(看那个贴官方答案的,每次安装执行那么长一坨命令就不头疼么?)另外,那篇[官解]里说脚本头部加上 shebang 行的,个人认为完全没有必要,为什么呢?Linux 里面,脚本加上 shebang 并赋予可执行权限,这样通过 "/路径/脚本" 的形式就可以执行脚本了,如果脚本没有赋予可执行权限时,这种方式就无法执行。而用以下这种方式:"python /路径/脚本" 或者 "python3 /路径/脚本" 无论有没有赋予脚本权限,无论有没有 shebang 行,脚本都是可以执行的,还是这种方式更直接一些。PS: Linux 下面多认识一下 PATH,用好 ln 、alias ,可以帮你解决好多问题 ,有时 virtualenv 也并不需要。☝ᖗ乛◡乛ᖘ☝ 完美