pip3 --version' 显示语法错误
这一切开始于我想为Python 3安装Requests库(我在使用OSX Mavericks,装了Python 2.7.5(通过brew install python
安装)和3.4.2(通过brew install python3
安装)。当我运行pip3 --version
(或者任何与pip3相关的命令)时,我看到的是:
$ pip3 --version
Traceback (most recent call last):
File "/usr/local/bin/pip3", line 7, in <module>
from pip import main
File "/usr/local/lib/python3.4/site-packages/pip/__init__.py", line 11, in <module>
from pip.vcs import git, mercurial, subversion, bazaar # noqa
File "/usr/local/lib/python3.4/site-packages/pip/vcs/mercurial.py", line 9, in <module>
from pip.download import path_to_url
File "/usr/local/lib/python3.4/site-packages/pip/download.py", line 22, in <module>
from pip._vendor import requests, six
File "/usr/local/lib/python3.4/site-packages/pip/_vendor/requests/__init__.py", line 53, in <module>
from .packages.urllib3.contrib import pyopenssl
File "/usr/local/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py", line 49, in <module>
from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT
File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/ndg/httpsclient/ssl_peer_verification.py", line 17
except ImportError, e:
^
SyntaxError: invalid syntax
当我运行Python 2.7.5版本时,我看到的是:
$ pip --version
pip 1.5.6 from /Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg (python 2.7)
为了确保一切正常,这里是我在输入交互式解释器时看到的内容:
$ python3
Python 3.4.2 (default, Oct 19 2014, 17:52:17)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
$ python
Python 2.7.5 (default, Mar 9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
很多其他关于更新pip3的回答建议我用这个命令来更新pip3:pip3 install --upgrade pip
,但这也出现了同样的错误,或者我可以使用easy_install -U pip
,但由于brew设置Python的方式,这个命令只会更新Python 2.7.5版本(没有easy_install3
)。有没有什么想法?
1 个回答
根本问题是,你不小心把一个只适用于 Python 2.x 的包安装到了你的 Python 3.x 的库里。
更深层次的问题是,你实际上有两个不同的 Python 2.7 安装(一个是苹果自带的,另一个是通过 Homebrew 安装的),这可能也和你把 2.7 的包放进 3.x 有关系……
总之,这个问题导致 pip
出现故障,因为 pip
有一些可选的依赖包,它会尝试导入这些包,如果这些包也有依赖包,依此类推,最终启动 pip
时会导入 ndg-httpsclient
这个包。
我不太确定你是怎么安装这个包的。标准的 Homebrew 3.x 会在两个额外的库目录中查找(你可以打开 python3
,然后输入 import sys; print(sys.path)
来查看它查找的所有地方,包括标准库和其他库),而不仅仅是 pip3
安装的那个目录。
在这种情况下,你不知怎么的把 2.x 版本的 ndg-httpsclient
安装到了 /usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages
这个地方。
因为你不是通过 pip
安装的这个包,而且更重要的是,你根本无法运行 pip
,所以你不能直接用 pip uninstall
来卸载它。因此:
rm -rf /usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/ndg*
这可能会影响到一些依赖于它的其他包。一旦你解决了这个问题,你可以使用 pip3 list
来查看你安装的所有库,并进行测试。如果你想谨慎一点,可以这样做:
$ pip3 list > mypackages
$ rm -rf <each site-package directory>
$ brew uninstall python3
$ brew install python3
$ pip3 install -r mypackages
你可能还想清理一下你的 Homebrew 2.7(或者干脆放弃它,只用苹果自带的——尤其是我很确定你其实是在用苹果的版本),以及苹果 2.7 的库(当然,苹果的 Python 本身是不能卸载的)。