52

我在使用 python 2.7.9-2 amd64 的 Debian 8 系统上遇到问题:

    marius@pydev:/usr/lib/python2.7/dist-packages/urllib3/contrib$ pip search doo
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    load_entry_point('pip==1.5.6', 'console_scripts', 'pip')()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 356, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2476, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2190, in load
    ['__name__'])
  File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 74, in <module>
    from pip.vcs import git, mercurial, subversion, bazaar  # noqa
  File "/usr/lib/python2.7/dist-packages/pip/vcs/mercurial.py", line 9, in <module>
    from pip.download import path_to_url
  File "/usr/lib/python2.7/dist-packages/pip/download.py", line 22, in <module>
    import requests, six
  File "/usr/local/lib/python2.7/dist-packages/requests/__init__.py", line 53, in <module>
    from .packages.urllib3.contrib import pyopenssl
  File "/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 73, in <module>
    ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD,
**AttributeError: 'module' object has no attribute 'PROTOCOL_SSLv3'**

我检查了lib并尝试修补/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/contrib/pyopenssl.py

    from .. import connection
from .. import util

__all__ = ['inject_into_urllib3', 'extract_from_urllib3']

# SNI only *really* works if we can read the subjectAltName of certificates.
HAS_SNI = SUBJ_ALT_NAME_SUPPORT

# Map from urllib3 to PyOpenSSL compatible parameter-values.
_openssl_versions = {
    ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD,
    **ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD,**
    ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
}
_openssl_verify = {
    ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
    ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
    ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER
                       + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
}

有人可以启发我如何解决这个问题吗?如果有人有线索,那就太棒了。我用谷歌搜索了这个问题,只发现不完整的补丁,而且很乱。一旦这个问题得到修复,也可能是错误跟踪器的一个案例。我对所有 Python 包都有这个问题。

4

7 回答 7

75

这实际上是 的问题urllib3,而不是pyopenssl。Debian最近在不支持 SSLv3 的情况下编译 OpenSSLurllib3只是假设支持存在。

该问题已在提交 b9b3b0102中得到修复,该提交是urllib3.

由于您将urllib3其用作 . 的一部分requests,而 . 又piprequests. 在撰写本文时,当前版本是 2.6.0,其中包含修复:

# pip install requests==2.6.0

requests由于鸡蛋问题,您可能会遇到升级问题。要解决此问题,您可以尝试暂时删除pyopenssl软件包、升级requests并重新安装pyopenssl

此外,您可能希望pip在尝试更新之前使用以下行进行更新requests

# sudo easy_install --upgrade pip
于 2015-03-16T15:52:50.080 回答
47

解决问题的另一种方法是使用

sudo easy_install --upgrade pip

然后正常使用 pip

于 2015-03-31T22:12:27.910 回答
14

我收到了同样的错误。
结合前面的答案:

sudo easy_install --upgrade pip

我还必须运行:

sudo pip uninstall pyopenssl
sudo pip install mozdownload

这解决了我的错误,也许它可以帮助其他人。我通过谷歌搜索来到这里:

AttributeError:“模块”对象没有属性“PROTOCOL_SSLv3”

于 2016-03-18T14:41:28.043 回答
6

我今天用 Ansible 遇到了这个问题。我解决了它: pip uninstall pyopenssl

也许这会帮助处于相同情况的其他人

于 2016-10-27T15:37:29.800 回答
3

从 Ubuntu 14 升级到 16 后,我收到此错误。升级更改了一些 Python 路径,这破坏了一些核心包。这个答案基本上为我解决了这个问题。

sudo apt-get purge python-pkg-resources
sudo apt-get -f install
sudo rm -Rf /usr/local/bin/pip
sudo apt-get install python-pip
sudo pip install -U pip
于 2017-02-04T17:30:52.477 回答
1

我遇到了同样的问题,我只是requests使用以下命令卸载并安装确切版本。

pip install requests==2.6.0

然后它工作

于 2018-10-15T07:02:05.523 回答
0

我在一个新的 Xenial 上遇到了这个问题,但我看到了很多答案都没有成功(有些我真的没有尝试过,因为我的大多数软件都是最新的)。最终为我解决的是: sudo pip install requests --upgrade ... 这只是对其他请求升级建议的一个转折。

于 2017-04-12T11:57:38.917 回答