关于pip与conda是否能混用的问题,Anaconda官方早就给出了回答
https://www.anaconda.com/blog/using-pip-in-a-conda-environment
以下结合原文进行了相应修改,旨在尽可能的表述清晰
先说结论,如果conda和pip 在相同环境下 掺杂使用,尤其是频繁使用这两个工具进行包的安装,可能会导致环境状态混乱
就像其他包管理器一样, 大部分这些问题均源于有限的能力来管理未安装的包 。 通过pip安装后再运行conda,有可能覆盖或潜在地破坏通过pip安装的包。同样,pip可能会升级或删除conda安装的某个包所依赖的包
有一些步骤可以用来避免在使用conda和pip一起时出现问题的环境破坏。 一个可靠的方法是只使用conda包 。如果需要conda没有提供的软件包,可以使用conda build来创建。对于在PyPI上可用的项目,conda skeleton命令可以生成一个用来创建conda包的配方,几乎不需要进行修改
https://docs.conda.io/projects/conda-build/en/stable/
但如果环境涉及大量只能在PyPI上获得的包,这可能会成为负担。在这些情况下, 最安全的做法是先通过conda安装所有支持的包后才使用pip安装不支持的包 。此外, 应该使用“--upgrade-strategy only-if-needed”参数运行pip,以防止不必要地升级通过conda安装的包。这是运行pip时的默认设置,不应更改
如果预计某项目需要混用conda与pip,最好的做法是将此安装放入一个专门的conda环境中,以保护其他环境免受pip可能会进行的任何修改,因为 conda环境是独立的,允许不同版本的包存在
https://conda.io/docs/user-guide/tasks/manage-environments.html
在conda环境中,尽可能使用硬链接而不是复制文件 。如果安装了相同的一组包,每个新的conda环境将只需要少量额外的磁盘空间。 许多用户依赖于由安装Anaconda或Miniconda创建的“base” conda环境,如果这个环境混杂着pip和conda安装的包,将会更难恢复 。另一方面,创建单独的conda环境允许随时整个删除和重新创建环境,而不会影响核心的conda功能
在conda环境中使用pip安装包时,conda并不会察觉到这些变更 ,并存在破坏环境的风险。一个可靠的方法是创建一个新的环境,并先通过conda安装需要的包,再运行pip。再次强调,主要问题是pip的“状态性(或关联性)”——安装包的顺序会关联更多的状态,这将使事情更难以正常工作
对于经常需要重建的环境,最好的做法是将conda和pip包要求存储在文本文件中 。 可以通过--file参数将包要求提供给conda,通过-r或--requirement(关于 requirement的一些总结其实早就写好了,一直躺在我的草稿箱中 )参数提供给pip
一个包含conda和pip要求的文件可以导出或通过conda env命令来控制环境。这两种方法的好处是, 描述环境的文件可以方便进行版本控制以及便于他人共享环境
Anaconda非常清楚结合pip和conda可能会遇到的困难。我们希望设置数据科学环境的过程尽可能简单。这就是为什么我们一直在向conda的下一个版本添加新功能,以简化这个过程。虽然还处于测试阶段,但conda 4.6.0允许conda考虑pip安装的包,并根据需要替换这些包或满足现有包的依赖关系。我们仍在测试这些新功能,但预计在不久的将来,conda和pip之间的交互将得到很大改善。
总结
在使用conda后再使用pip
-
使用conda尽可能多地先安装支持的包,再使用pip
-
使用“--upgrade-strategy only-if-needed”(默认设置)运行pip
-
不要使用“--user”参数,避免所有“用户”安装
使用conda进行环境隔离
-
创建一个conda环境来隔离pip所做的任何更改
-
由于硬链接特性,不同环境下重复安装包不会复制文件,环境所占空间很小
-
应注意避免在默认的 conda 环境下(如base)运行 pip
如果需要对环境进行更改,请重新创建环境
-
一旦在conda环境中使用pip安装包,conda无法定位环境发生变更
-
要安装额外的conda包,最好重新创建环境
将conda和pip相关的包要求以文本文件形式存储
-
通过--file参数将包要求提供给conda
-
通过-r或--requirement参数提供给pip
-
conda env将基于包含conda和pip需求的文件导出或创建环境