pip 20.x下载SciPy 1.4.1源码后被清理的问题及解决方法
我来帮你理清这个问题的来龙去脉,以及对应的解决办法——之前处理过类似的pip版本兼容性坑,刚好能给你明确的方向。
为什么pip 20.0/20.0.1/20.0.2会出问题?
在pip 20.0.x版本中,团队对download命令的流程做了一个行为变更:当你使用--no-binary=:all:下载源码包时,pip会自动触发「安装构建依赖」的步骤,哪怕你根本不需要安装包。这个设计原本是为了让后续的安装流程更顺畅,但它会在构建依赖检查失败时,自动清理已经下载好的源码包。
而且你提到的--no-deps参数在这里不生效,是因为这个参数只控制是否下载运行时依赖,而pip的构建依赖检查属于内部流程,不受--no-deps的影响。
可行的解决办法
1. 降级pip到19.3.x版本
这是最直接的方案,因为19.3及更早版本的pip还没有引入这个强制构建依赖检查的逻辑。执行以下命令降级:
python3 -m pip install pip==19.3.1
之后再运行你原来的下载命令,就能正常保留SciPy 1.4.1的源码包了:
python3 -m pip download --no-binary=:all: scipy==1.4.1
2. 添加--no-build-isolation参数
pip 20.0.x本身支持--no-build-isolation参数,它能跳过构建隔离环境的创建,也就不会去尝试安装构建依赖了。修改你的下载命令为:
python3 -m pip download --no-binary=:all: --no-build-isolation scipy==1.4.1
这个参数会阻止pip执行构建依赖的检查步骤,下载后的源码包就不会被自动清理了。
3. 升级pip到20.1及以上版本
pip团队在20.1版本中修复了这个问题,调整了download命令的逻辑:当使用--no-binary=:all:时,不再强制执行构建依赖的检查。你可以升级pip到20.1或更高版本:
python3 -m pip install --upgrade pip>=20.1
升级后再执行原来的下载命令,就能正常工作了。
4. 手动下载源码包(备选方案)
如果上面的命令行方案都不想用,你可以直接去PyPI找到SciPy 1.4.1的页面,下载对应的.tar.gz源码包。这个方法适合偶尔操作的场景,不需要依赖pip的命令行逻辑。
内容的提问来源于stack exchange,提问作者jmd_dk

