同时使用conda和pip安装Python包的版本判定及相关问题咨询
问题1:仅通过pip升级了scikit-learn,为什么conda中的scikit-learn版本也同步更新了?
你当前使用的pip是绑定在激活的conda环境下的,pip安装/升级包时默认会写入对应conda环境的site-packages目录。而conda list会扫描当前环境site-packages下的所有包,不管安装来源是conda还是pip,所以你用pip升级后conda也能识别到新版本,返回结果里的pypi标记就说明这个包是pip从PyPI源安装的,并非来自conda官方源。
问题2:为什么一开始无法通过conda升级scikit-learn?是否是conda还未完成对新版本的适配?
确实是版本适配滞后导致的。PyPI上的包是开发者发布后可以直接上传上架,而conda源的包需要对应维护者重新适配conda的依赖体系,经过构建、测试全流程后才能发布到源上。scikit-learn 1.0刚发布时,conda官方源还没完成对应的打包上传,所以会报PackagesNotFoundError。
问题3:一般情况下,conda是如何确定支持哪些包的?
conda可安装的包完全由你配置的**软件源(channel)**决定:
- 默认的
defaults源是Anaconda官方维护的,收录的包都经过官方兼容性验证,更新速度相对较慢 - 常用的社区源
conda-forge由全球开发者共同维护,收录的包更多、更新速度更快 - 你也可以自行添加第三方源,拓展可安装的包范围
只有对应源的维护者完成了包的打包、构建、测试流程后,你才能通过conda从该源安装对应版本的包。
问题4:如果同时用conda和pip安装了同一个Python包,调用该包的函数时,会使用哪个安装源的版本?
调用的版本和安装源无关,完全由Python的模块搜索路径(sys.path)的优先级决定:Python导入模块时会按sys.path里的路径从前到后扫描,找到第一个匹配的包就会加载。
大多数情况下,同一conda环境下如果先后用conda、pip安装同一个包,pip会直接覆盖site-packages目录下conda安装的包文件,最终调用的是pip安装的版本;如果两个包安装在不同的环境下,就看哪个环境的路径在sys.path中排序更靠前。
内容的提问来源于stack exchange,提问作者E. Turok
相关产品推荐
相关产品推荐

