pip3 --version' 显示语法错误

2 投票
1 回答
7389 浏览
提问于 2025-04-29 03:34

这一切开始于我想为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 个回答

5

根本问题是,你不小心把一个只适用于 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 本身是不能卸载的)。

撰写回答