大部分情况下,conda install & pip install 二者安装的package都可以正常work,但是混装多种package后容易版本冲突,出现各种报错。
目录
检查机制
支持语言
库的位置
环境隔离
编译情况
检查机制
conda有严格的检查机制,会配套安装依赖,能够保证当前安装的package安装好后能work,但是conda只检查用conda安装的package。例如,新安装的package需要依赖numpy ,本地已有使用pip安装的numpy(1.19.2),conda在新安装package时可能会视为没有numpy,然后通过conda再安装一个依赖版本的numpy(1.18.5)。这时候,两个numpy就会冲突。甚至报错DLL load failed: 找不到指定的模块。
pip的检查机制相对宽松,可以既检查conda安装过的package的也检查pip安装过的package。并不保证当前环境的所有包的所有依赖关系都同时满足。当某个环境所安装的包越来越多,产生冲突的可能性就越来越大。
支持语言
conda 是跨平台的通用包和环境管理器,可以支持多种语言,除了Python和R,conda还支持Ruby、Lua、Scala、Java、JavaScript、C/C++、Fortran等多种编程语言,以及大部分生信软件的安装。
pip 是 python 官方推荐的包下载工具,它专注于为Python用户提供软件包安装、更新和卸载的功能。因此,pip主要支持的语言是Python。通过pip,Python用户可以轻松地从Python Package Index(Python包索引)中获取并安装所需的软件包。
综上所述,conda和pip在支持的语言方面有所不同。conda以其广泛的编程语言支持而著称,而pip则专注于Python语言的软件包管理。用户可以根据自己的需求和所使用的编程语言来选择合适的软件包管理工具。
库的位置
conda install:这种方式安装的库都会放在anaconda3/pkgs目录下,这样的好处就是,当在某个环境下已经下载好了某个库,再在另一个环境中还需要这个库时,就可以直接从pkgs目录下将该库复制至新环境而不用重复下载。
pip install:分两种情况,如果当前conda环境使用系统的的python,则库会被保存在 ~/.local/lib/python3.x/site-packages文件夹中;如果使用的是当前conda环境内置的python,则库会被保存到 anaconda3/envs/current_env/lib/site-packages中
环境隔离
conda 可以直接创建隔离的环境,例如conda create -n 环境名 python=3.6。conda通过在系统中创建独立的文件夹来实现环境隔离。每个环境都有自己的Python解释器、库和二进制文件。当激活一个conda环境时,conda会修改系统的环境变量,使得运行Python或相关工具时,实际上是在当前环境中运行。
- conda可以管理多个Python版本,即使版本不同也能实现环境隔离。
- conda的环境导出和复制功能使得在不同机器上复制相同环境变得简单。
pip 没有内置支持环境隔离,只能借助其他工具例如virtualenv or venv实现环境隔离,virtualenv和venv可以创建独立的Python虚拟环境,每个环境都有自己的Python解释器和库。
- 使用virtualenv或venv创建虚拟环境后,用户可以在该环境中独立地安装和管理第三方库。
- 激活虚拟环境后,pip会自动将第三方库安装到虚拟环境中,而不会影响到全局的Python环境。
编译情况
conda在安装软件包时,会尝试自动解决依赖关系,并下载和编译所需的依赖包。对于预编译的包(如二进制包),conda会优先使用这些包以加快安装速度。如果conda无法找到预编译的包,它可能会尝试从源代码编译软件包,但这通常不是其主要功能。
- conda允许用户指定编译选项和配置,例如使用特定的编译器版本、启用或禁用特定的编译特性等。
- 这些选项通常通过conda的构建脚本或配置文件来设置。
pip 里的软件包为wheel版或者源代码发行版。wheel属于已编译版的一种,但而源代码发行版必须要经过编译生成可执行程序后才能使用。pip在安装软件包时,也会尝试解决依赖关系,但它通常不会从源代码编译依赖包,而是下载已编译的二进制包(如果可用)。如果pip无法找到已编译的二进制包,它可能会尝试从源代码编译软件包,但这需要用户具备相应的编译环境和工具。
- pip允许用户通过命令行选项或环境变量来指定编译选项和配置。
- 然而,与conda相比,pip的编译选项和配置可能更加有限和复杂。