【问题标题】:Pip install fails: SSL requiredPip 安装失败:需要 SSL
【发布时间】:2018-04-15 15:36:28
【问题描述】:
Collecting rsa==3.1.1 (from -r /racetrack/.requirements.txt (line 41))
eval (python -m virtualfish)
  Downloading rsa-3.1.1.tar.gz
    Complete output from command python setup.py egg_info:
    Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.10.tar.gz
    Traceback (most recent call last):          
      File "/usr/lib/python2.7/urllib2.py", line 558, in http_error_default
        raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
    urllib2.HTTPError: HTTP Error 403: SSL is required

【问题讨论】:

    标签: python dependencies pip rsa


    【解决方案1】:

    解决方案:升级到最新版本的库。

    一切从这里开始,突然(2017 年 10 月)Distutils 团队决定撤销对非 https 请求的支持,而不用担心破坏许多 python 库早期版本的向后兼容性。有点不专业,但嘿,这是 Python 世界。

    所以这里是修复,只需在任何库(nltk==3.2.5 等)上转到最新版本的库(在我的情况下为 rsa==3.4.2

    替代解决方案:fork(或本地复制)repo 版本并将http url 修改为https

    尽管如此,请注意您是否在维护另一个项目的同时这样做,因为您正在升级的依赖项可能与作者想要的原始库不兼容,例如在我的上下文中 rsa 在另一个库下用作依赖。因此解决方案是升级父库,以便自动处理此问题。

    【讨论】:

    【解决方案2】:

    不幸的是,以前的答案都不适合我。

    恕我直言,pip / distutils 选择在 http repos 上破坏包是非常愚蠢的。

    我认为更好的选择是:

    • pip/distutils 默认使用 https

    • 如果出现错误,比如 403,pip 必须提示你“包 repo 在 http,你要下载吗?”

    2020 年仍有许多 Python 2 包在 http repos 上;随着他们的决定,这些软件包的安装被破坏了。


    对我来说可行的解决方案是一个非常简单的 python 核心模块补丁:

    --- /usr/local/lib/python2.7/urllib2.py.original
    +++ /usr/local/lib/python2.7/urllib2.py
    @@ -427,6 +427,9 @@
                 req = meth(req)
    
             response = self._open(req, data)
    +        if protocol == "http" and response.code == 403 :
    +            if isinstance(fullurl, basestring) and fullurl.startswith("http://pypi.python.org/packages/source/d/distribute/") :
    +                return    self.open(fullurl.replace("http://", "https://"), data = data, timeout = timeout)
    
             # post-process response
             meth_name = protocol+"_response"
    

    工作:如果失败的 url 在 http 上,请在 https 上重试。

    我知道它有点难看,但它很清楚,你也可以快速恢复到原始模块(复制 /usr/local/lib/python2.7/urllib2.py 之前应用此补丁)。

    【讨论】:

    • 这个解决方案并不丑陋,至少在他们决定放弃支持的程度。
    • 谢谢。这也是唯一对我有用的解决方案。
    • 像魅力一样工作。如果您使用的是现有的 virtualenv,则可能需要在应用此更改后重新创建它。
    【解决方案3】:

    接受的答案在我的情况下不起作用(在老 Raspbian 上),但提供带有命令的下载 URL 对我有帮助,如 this 帖子中所述:

    sudo pip install paho-mqtt -i https://pypi.python.org/simple
    

    【讨论】:

    • 你也可以使用sudo pip install -U pip -i https://pypi.python.org/simple来绝对解决问题!
    【解决方案4】:

    只需easy_install rsa==3.1.1 即可完成这项工作。

    【讨论】:

    • HTTPError 403: '需要 SSL'
    • 您使用的是哪个操作系统?
    【解决方案5】:

    使用 easy_install 而不是 pip 对我有用:

    easy_install funkload
    

    我试图 pip install funkload 并得到:

    Collecting funkload
      Using cached funkload-1.17.1.tar.gz
      Complete output from command python setup.py egg_info:
      Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.14.tar.gz
      Traceback (most recent call last):
    ...<snip>
      urllib2.HTTPError: HTTP Error 403: SSL is required
    

    由于 funkload 的日期是 2011 年,因此较旧的 easy_install 可以正常工作。

    【讨论】:

      猜你喜欢
      • 2017-04-27
      • 1970-01-01
      • 2012-01-11
      • 2014-09-07
      • 2018-10-23
      • 1970-01-01
      • 2016-09-25
      • 2021-02-27
      相关资源
      最近更新 更多