即使我使用pip install dedupe
或pip install --trusted-host pypi.python.org dedupe
,Pip也总是无法通过ssl
无论如何,输出总是相同的:
收集重复数据消除
在连接被“SSLError(SSLError(1,'[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:777)'),)':/简单/重复数据消除/
正在重试...
跳跃
找不到满足重复数据消除要求的版本(来自以下版本:)未找到与重复数据消除匹配的分发
所以我卸载了anaconda并重新安装了它。一样的
你认为问题是我的_ssl。c文件(我不知道它在哪里)一定是损坏了什么的?如果我告诉pip无论如何都要绕过ssl验证,为什么pip需要引用它呢?
6条答案
按热度按时间lf3rwulv1#
它可能与PyPI结构域的2018 change有关。
请确保您的防火墙/代理允许访问/访问:
所以你可以给予一下这样的东西:
$ python -m pip
install
--trusted-host www.example.com --trusted-host www.example.com --trusted-host www.example.com [--proxy ...] [--user]<packagename>
有关
--user
选项的说明,请参阅$ pip help install
(如果在virtualenv中,请省略)。--trusted-host
选项实际上并没有绕过SSL/TLS,但允许在(且仅在)主机没有有效(或任何)HTTPS时将其标记为受信任。PiPY应该没什么关系,因为www. example www.example.com (以前的 www.example.com )* 确实 * 使用HTTPS,并且在它前面有CDN,它总是强制执行TLSv 1。2握手要求,而不管连接的PIP客户端选项。但是如果你有自己的本地镜像网站www. example www.example.com 。哦,如果您使用代理,请确保还指定:--proxy [user:passwd@]proxyserver:port
一些企业代理甚至可能会在运行中replace HTTPS连接的证书。如果您的系统时钟不同步,也可能会破坏SSL验证过程。
如果防火墙/代理/时钟没有问题,那么检查pip的SSL握手中使用的SSL证书。实际上,您可以获取当前的cacert.pem(来自curl的Mozilla CA捆绑包),并使用pip选项
--cert
进行尝试:$ pip --cert ~/cacert.pem install --user <packagename>
其中,
--cert
参数是PEM格式的备用CA捆绑包的系统路径。(关于--user选项,请参见下文)。或者,也可以创建一个自定义配置~/。然后将选项指向有效的系统证书(或您的cacert)。pem)作为解决方法,例如:
(or另一个pem文件)
甚至可以手动替换原始cacert。pem在pip中与您可信赖的CA捆绑包一起找到(例如,如果您的pip非常旧)。较早的pip版本知道在pip/_vendor/requests/cacert之间回退。pem和系统存储,如
/etc/ssl/certs/ca-certificates.crt
或/etc/pki/tls/certs/ca-bundle.crt
,但在最近的pip中,情况不再如此,因为它似乎只依赖于pip/_vendor/certifici/cacert。PEM基本上,pip包使用
requests
,urllib3
,除其他外,验证SSL证书;并且所有这些都在PIP内与X1 M14 N1 X包(从PIP 9开始也包括在内)一起被运送(出售)。0.2),提供当前CA捆绑包(cacert.pem文件)进行TLS验证。requests本身在内部使用urllib 3和certifici,在9之前。0.2,pip使用cacert。请求或系统的PEM。这意味着实际更新pip可能有助于修复CERTIFICATE_VERIFY_FAILED错误,特别是如果操作系统和pip是很久以前部署的:$ conda update pip
-因为issues can arise如果conda和pip
都在同一环境中一起使用。如果没有可用的pip版本更新,他们可以尝试:$ conda config --add channels conda-forge; conda update pip
或者,也可以单独使用conda来直接安装/管理python包:它是一个完全独立于pip的工具,但在包和venv管理方面提供了类似的功能。它的包不是来自PyPI,而是来自anaconda's own repositories。问题是,如果你混合使用这两种方法,并在
pip
之后运行conda,前者可能会覆盖和破坏通过pip安装的包(及其依赖项),并使其无法使用。因此,建议 * 只使用其中一个 *,或者,如果必须的话,在 * conda之后使用 *only pip(在pip之后不使用conda),并且仅在隔离的conda环境中使用。如果您使用的是OS发行版提供的pip版本,则使用供应商提供的升级来进行系统范围的pip更新:
$ sudo apt-get install python-pip
或:$ sudo yum install python27-pip
一些更新可能不容易获得,因为发行版通常落后于PyPI。在这种情况下,可以在用户级别升级pip(在 $HOME 目录中),或者在virtualenv中升级,比如:
$ python -m pip install --user --trusted-host files.pythonhosted.org --trusted-host pypi.org --trusted-host pypi.python.org --upgrade pip
(omit
--user
(如果在虚拟环境中)--user
交换机将只为当前用户升级pip(在您的家中~/。local/lib/)而不是整个操作系统,这是避免干扰系统python包的好做法。它在最近的Ubuntu/Fedora版本中分发的pip中默认启用。如果您不使用此选项并且碰巧覆盖了操作系统级的系统pip,请注意如何解决ImportError。或者(也是在用户级别),您可以尝试:
$ curl -LO https://bootstrap.pypa.io/get-pip.py && python get-pip.py --user
PyPA script包含一个提取。pip中的pem SSL包。_vendor.certifi.
否则,如果仍然不成功,请尝试运行pip with
-vvv
选项,以向输出添加详细信息,并检查现在是否存在由tlsv1 alert protocol version引起的另一个SSLError
。91zkwejq2#
这对我来说很有用,试试这个:
pip install --trusted-host=pypi.org --trusted-host=files.pythonhosted.org --user {name of whatever I'm installing}
ccgok5k53#
我遇到了同样的问题,因为我安装了Zscaler(云安全软件),导致:
正如其他人提到的,下面将修复单个包安装。不需要
pypi.python.org
,因为它已被pypi.org
替换。我通过创建
pip.ini
文件(Unix中的pip.conf
)并添加以下内容永久修复了该问题:请参阅pip configuration files了解如何找到
pip.ini
,或者如果需要创建一个pip.ini
,请将其放置在何处。kx5bkwkv4#
我的方法是@Alex C的答案的简化:
rdlzhqv95#
上面的错误或类似的错误是由虚拟机(VM)没有时间同步引起的,我的客户机Ubuntu VM是过去几天的。
我运行了这个commit来让VM获取正确的网络时间:
这使得Ubuntu客户机操作系统获得网络时间。(您可能需要提供网络时间源。我用了这篇文章:Digital Ocean - How to set time on Ubuntu)
检查时间是否正确:
重新运行失败的pip命令。
mbjcgjjk6#
macOS用户:
问题是Python 3。6+不再使用macOS的OpenSSL,而是使用自己的捆绑OpenSSL,无法访问macOS的根证书。这是永久的解决办法。
首先运行以下命令:
将其添加到您的
~/.bash_profile
(或~/.zprofile
或您的shell使用的任何启动文件),以便您的环境知道在哪里可以找到证书CA包:重新启动shell,或重新创建shell启动文件:
pip3(或任何发出HTTPS请求的Python脚本)现在应该可以工作,而无需使用长pip3命令或危险地禁用证书验证。
旁注:您可能注意到我没有包括 www.example.com 。这是因为它自2018年以来一直被弃用。我已经有一年多没有把它包括进去了,我从来没有遇到过问题。据我所知,它现在没有使用。