pip什么都装不上 报错Could not find a version that satisfies the requirement

本篇文章写于2019年3月8日,当前Python稳定版最高版本为3.7.2,最高测试版本为3.8.0 Alpha 2 (3.8.0a2)。

今天一位同学想用pip安装opencv-contrib-python这个包,却一直报错:

Could not find a version that satisfies the requirement opencv-contrib-python (from versions: )
No matching distribution found for opencv-contrib-python

后面还附带了pip可以更新的提示:

You are using pip version 18.1, however version 19.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

pypi上看了一下这个包,其中有这么一句话:

Q: Pip fails with Could not find a version that satisfies the requirement ...?

A: Most likely the issue is related to too old pip and can be fixed by running pip install --upgrade pip. Note that the wheel (especially manylinux) format does not currently support properly ARM architecture so there are no packages for ARM based platforms in PyPI. However, opencv-python packages for Raspberry Pi can be found from https://www.piwheels.org/.

于是认为是pip版本过低导致的,就更新了一下pip。(windows下需要使用任务管理器新建任务并附带管理员权限才行)

更新了pip之后试图下载opencv-contrib-python仍然提示失败,错误提示一致,于是开始怀疑是否跟pip缓存有关,决定清理pip缓存。

windows下缓存位于 %LocalAppData%\pip\cache ,linux下位于 ~/.cache/pip ,mac osx下位于 ~/Library/Caches/pip

清理pip缓存之后重试,问题依旧,于是怀疑pip已损坏,用 certutil -hashfile pip3.exe sha256 在同学机器上和我的机器上分别校验了一下,发现值不相同(这是个坑,等下再说),于是先用pip删掉了pip和setuptools,然后使用python -m ensurepip尝试从本地提取一份新的pip,发现还是不行。于是用官方pip下载脚本又重新安装了一次pip,结果过程中反复出现read operation timed out,大概是网速的缘故吧。最后通过手动下载whl文件,用python install勉强把pip升级到了最新版。pip -V这次正常了。

至此,思绪全无,遂泡下一杯咖啡准备仔细调查原因。有没有可能装了pip2和pip3冲突了?发现目标机只有Python 3,排除。会不会因为python是32位的?输入python,输出提示Python 3.8.0a1 amd64,发现是64位版本,但感觉好像哪里有点不对。*上说有可能pypi的index出现损坏,于是在我本机上试了一下pip install opencv-contrib-python,发现一切正常,排除。另有说法成pip由于某种原因可能会出现无法建立ssl连接的情况,于是尝试pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn,仍然报一样的错误。

后来决定尝试使用-v选项查看,结果发现出现了这样的提示:

pip什么都装不上 报错Could not find a version that satisfies the requirement

当我看到 it is not compatible with this Python 的时候,我猛然想到之前看见的Python 3.8.0a1,又突然想到我的版本是Python 3.7.2,再联想到之前Ubuntu 17.04的apt什么都装不上结果发现Zesty已经被抛弃了,我突然发觉可能是因为这个python版本比较诡异,导致pip里面那些库都没有为其编译或改写过(因为图里都是cp36,cp37,看起来大概就是CPython 3.6,CPython 3.7),所以才会一直报错说找不到合适的版本吧。不过pip只给出了一个非常令人困惑的结论,却没能给出导致找不到合适版本的原因,这就比较坑了。

当我打开python官网,我翻遍了release列表也没有找到Python 3.8的字样,又搜了一圈才在Changelog这里发现了仍然处于Alpha 1阶段的Python 3.8.0。真相大白咯!

随后非常流畅的给同学安装上了Python 3.7.2,配置了pip,于是一切都正常了!

========== HAPPY ENDING ==========

PS: 至于同学是从哪获取的python3.8,他说他也不知道。我猜大概是百度了 “Python最新版下载" 之后从第三方站点下载的吧...

PS2: 关于文中提到的比对我本机和同学机器上pip的时候sha256不一致的问题,其实是当时忘记我本机已经更新到最新pip了... 如果能提前发现的话可能还能少绕一点弯... 看来在解决问题的时候还是要时刻保持谨慎和专业啊!