如何防止pip安装依赖numpy的包时替换numpy+mkl为普通numpy?
解决pip安装依赖numpy的包时替换numpy+mkl的问题
我太懂这个坑了!很多人都会遇到:当你用pip install或者pip install --upgrade安装依赖numpy的包(比如gym,它的setup.py里明确写了install_requires=['numpy>=1.10.4'])时,明明你已经装了满足版本要求的numpy+mkl,pip却非要把它卸载,换成不带+mkl后缀的普通numpy,结果导致其他依赖MKL的包直接跑不起来。
问题根源
你猜的没错,这确实和+mkl后缀脱不了干系。PyPI上的官方numpy包是不带MKL加速库的,而带+mkl的版本一般是第三方编译发布的。pip的依赖解析逻辑有点“认死理”——它会把numpy+mkl当成一个和标准numpy完全不同的包,哪怕版本号(比如1.21.5+mkl)里的核心版本满足要求,pip也会觉得“这不是我要找的numpy”,于是就会卸载numpy+mkl,重新安装标准版的numpy来满足目标包的依赖。
实用解决办法
这里给你几个靠谱的解决思路:
- 锁定numpy,跳过依赖安装
先确保你已经装好numpy+mkl,然后用pip install --no-deps <目标包名>来安装需要的包。这个参数会让pip跳过处理目标包的依赖,自然就不会动你的numpy了。之后如果目标包还需要其他依赖,再手动安装那些依赖就行,避开numpy就好。 - 安装带MKL的官方兼容版numpy
有些第三方源提供了被pip识别为标准numpy的MKL增强版,比如Intel的PyPI源,你可以用这条命令安装:
这样装的numpy带MKL,而且pip会把它当成标准numpy的一部分,后续安装依赖numpy的包时就不会乱替换了。pip install numpy[mkl] --index-url=https://pypi.anaconda.org/intel/simple - 修改目标包的依赖配置(仅限源码安装场景)
如果你是从源码安装目标包,可以修改它的setup.py文件,把install_requires里的numpy>=x.x.x改成numpy[mkl]>=x.x.x,或者直接指定带MKL的版本号。不过这个办法只适合你自己编译包的情况,直接用pip装官方包的话就没法用了。
内容的提问来源于stack exchange,提问作者Dennis Soemers
相关产品推荐
相关产品推荐

