Pip 安装失败:需要 SSL

新手上路,请多包涵
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

原文由 nehem 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

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

所以这里是修复,只需在任何库( rsa==3.4.2 nltk==3.2.5 等)

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

尽管如此,请注意您是否在维护另一个项目时执行此操作,因为您正在升级的依赖项可能与作者预期的原始库不兼容,例如在我的上下文中 rsa 在另一个库下使用为一种依赖。因此,解决方案是升级父库,以便自动解决此问题。

原文由 nehem 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

恕我直言,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 的副本) .

原文由 Massimo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题