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

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

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

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

替代解决方案:分叉(或本地复制)repo&将httpurl修改为https

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

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

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

我认为更好的选择是:

  • pip/distutils默认使用https

  • 如果出现错误,比如403,pip必须建议你"软件包回购在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)。

只要一个easy_install rsa==3.1.1就能完成这项工作。

接受的答案在我的情况下(在一个老树莓上)不起作用,但提供带有命令的下载URL帮助了我,如本文所述:

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

使用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是有效的。

最新更新