Pip安装失败:需要SSL

13
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
5个回答

13

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

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

因此,修复方法很简单,只需升级到最新版本的库(在我的情况下是rsa==3.4.2,在其他库中是nltk==3.2.5等)。

备用方案:分叉(或本地复制)repo的版本,并将http URL修改为https

无论如何,如果您在维护另一个项目时进行此操作,请注意,您正在升级的依赖项可能与原始库作者打算使用的原始库不兼容,例如,在我的上下文中,rsa被用作另一个库的依赖项。因此,解决方案是升级父库,以便自动处理此问题。


1
Distutils发布说明(2017年10月):https://mail.python.org/pipermail/distutils-sig/2017-October/031714.html - nehem
5
我觉得这个回答没有帮助。哪个库?如何实现? - SoloPilot
@SoloPilot 这个答案的重点是,多个库可能存在问题。您应该升级到您正在尝试安装的库的最新版本。这预设库维护者在新版本中更新了其设置脚本。许多旧库已经完全停止支持。现代的新项目打包指南甚至不再期望您使用 distutils - Karl Knechtel

8
很遗憾,之前的答案对我都不起作用。
在我看来,pip/distutils选择破坏HTTP存储库上的软件包是非常愚蠢的。
我认为更好的选择应该是:
  • pip / distutils默认使用HTTPS

  • 如果出现错误,例如403,pip必须建议您“软件包存储库在HTTP上,您是否要下载它?”

到2020年仍有许多Python 2软件包位于HTTP存储库中;他们的决定破坏了这些软件包的安装。
对我而言有效的解决方案是一个非常简单的补丁,只需修改一个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)。


4
这个解决方案并不丑陋,至少就他们决定停止支持的程度而言。 - nehem
1
谢谢。这是唯一对我有效的解决方案。 - L. Amber O'Hearn
非常好用。如果您正在使用现有的虚拟环境,则可能需要在应用此更改后重新创建它。 - jweyrich
直到 2020 年,许多 Python 2 包仍然存放在 HTTP 存储库中。自 2020 年 1 月 1 日起,Python 2 不再得到支持,如果您在安装 Python 2 包时遇到问题,则是您自己的问题。Python 2.7 和 Windows 7 一样过时了。 - Karl Knechtel

2

在我的情况下(在一个较旧的Raspbian上),接受的答案不起作用,但是像这个帖子中描述的那样,提供下载URL与命令一起使用对我有帮助:

最初的回答并没有解决我的问题。

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

你也可以使用 sudo pip install -U pip -i https://pypi.python.org/simple 来确保解决问题! - Elektordi

2

只需要运行easy_install rsa==3.1.1即可完成任务。


HTTPError 403: "需要 SSL" - Mr Mike
你使用的是哪个操作系统? - iMitwe

0

使用 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仍然可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接