Conda和pip通常被认为几乎完全相同。虽然这两个工具的某些功能重叠,但它们设计用于不同的目的。 Pip是Python Packaging Authority推荐的用于从Python Package Index安装包的工具。 Pip安装打包为wheels或源代码分发的Python软件。后者可能要求系统安装兼容的编译器和库。
Conda是跨平台的包和环境管理器,可以安装和管理来自Anaconda repository以 Anaconda Cloud的conda包。 Conda包是二进制文件,需要使用编译器来安装它们。另外,conda包不仅限于Python软件。它们还可能包含C或C ++库,R包或任何其他软件。
Pip和conda在如何实现环境中的依赖关系方面也有所不同。安装包时,pip会在递归的串行循环中安装依赖项。没有努力确保同时满足所有包的依赖性。如果较早安装的软件包与稍后安装的软件包具有不兼容的依赖性版本,则可能导致破坏的环境。conda使用可确保满足环境中安装的所有包的所有要求。此检查可能需要额外的时间,但有助于防止创建破坏的环境,前期关于依赖关系包的元数据是正确的。
最后,pip的包跟conda不完全重叠,有些包只能通过其中一个装。
笔者以当前虚拟环境Thin下安装非Python包 ffmpeg为例:
(Thin) root@348a24e5dea7:/data# conda install ffmpeg
如上图所示:可以发现使用conda install 的安装目录的确是在 xxxxx\Anaconda3\pkgs 。
执行下面的命令又会发现:
(Thin) root@348a24e5dea7:/data# whereis ffmpeg
值得注意的是:conda install 也会在其关联虚拟环境下的bin目录里生成一个对应的二进制文件,该文件就是执行该程序的命令。
如何修改conda 和pip的默认安装路径?
在conda虚拟环境下使用pip安装包,但却发现虚拟环境里conda list没有导入该包?
参考下面这篇文章
修改conda环境和缓存默认路径/修改Python 的 pip install 默认安装依赖路径
因为1的原因,conda安装多个环境时,因为这些虚拟环境互相关联,所以同一个包只需要安装一次,且在同一个目录里,由conda通用管理,而pip每次安装只是在当前的虚拟环境下。
pip list:
conda list:
由前文可知Conda是跨平台的包和环境管理器,所以在上图 Build Channel 里可以看到conda 可以管理各种类型的包。
Conda list 除了可以查询当前虚拟环境和关联环境下的python包,还有非python包。
Pip list 只能查询当前虚拟环境下的pyhon包。
当关联环境下有这个包,再用conda在其他虚拟环境下下载该包
就会直接关联,不用下载。
比如说base环境下有包,在另一个环境下载同样的包,就会关联上,不用真的下载,直接复制过去或者关联即可
验证得到:pip下的list是conda下list的子集。
在conda配置的环境下,使用conda install 命令安装python包,在编写python程序import时,容易报“ImportError: DLL load failed: 找不到指定的模块。”错误。
由前文可知pip是python包管理器,而conda是跨平台的通用管理器。
conda是用来安装conda package,虽然大部分conda包是python的,但它支持了不少非python语言写的依赖项,比如mkl cuda这种c c++写的包。不过anaconda本身只提供部分包,远没有pip提供的包多,有时conda无法安装我们需要的包,我们需要用pip将其装到conda环境里。
因此安装之前需要清楚什么是python包和非python包。
顾名思义,是需要在python环境下面使用并且可以import 的包。
并且如果在shell里直接输入该包名,系统也会无法识别。以numpy为例:
即非python语言所写的包,该包的安装的安装路径会被写入环境变量,因此shell可以直接识别,以ffmpeg为例:
1. 对于绝大多数python包,既可以通过pip install 也可以通过conda install 来安装。
2. 对于一小部分非python包,则必须通过conda install 来安装。
以安装ensorflow-gpu 为例,同时需要注意:
① 用 pip 安装的话,只会安装 tensorflow-gpu 这个包,它的依赖(比如 cuda)需要手动安装,而且版本配置不对的话,可能导致 tensorflow-gpu 无法使用;
② 用 conda 安装的话,除了安装 tensorflow-gpu 这个包,它会自动检测这个包所需的依赖,如果没有,会自动安装一遍。