全面总结 pip install 与 conda install 的使用区别

一、写在前面

  • conda install xxx:这种方式安装的库都会放在 anaconda3/pkgs目录下,这样的好处就是,当在某个环境下已经下载好了某个库,再在另一个环境中还需要这个库时,就可以直接从pkgs目录下将该库复制至新环境而不用重复下载。

  • pip install xxx:分两种情况,一种情况就是当前conda环境的python是conda安装的,和系统的不一样,那么xxx会被安装到 anaconda3/envs/current_env/lib/python3.x/site-packages文件夹中,如果当前conda环境用的是系统的python,那么xxx会通常会被安装到 ~/.local/lib/python3.x/site-packages文件夹中

这里引出一个问题:conda和pip安装同一个xxx库情况下,conda环境下python代码中import xxx时,谁安装的xxx优先级较高会被import,这个问题通过下面这条命令可以解决:

python -m site

在我的机器上,会有类似下面输出:

sys.path = [
    '/data1/calculation/Cluster_Coupling/chiralcluster_chiralmol',
    '/opt/anaconda3/envs/gpaw/lib/python311.zip',
    '/opt/anaconda3/envs/gpaw/lib/python3.11',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/lib-dynload',
    '/home/gn/.local/lib/python3.11/site-packages',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/gpaw-22.8.0-py3.11-linux-x86_64.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/PyYAML-6.0-py3.11-linux-x86_64.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/scipy-1.10.1-py3.11-linux-x86_64.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/ase-3.22.1-py3.11.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/matplotlib-3.7.1-py3.11-linux-x86_64.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/python_dateutil-2.8.2-py3.11.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/pyparsing-3.1.0b2-py3.11.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/Pillow-9.5.0-py3.11-linux-x86_64.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/packaging-23.1-py3.11.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/kiwisolver-1.4.4-py3.11-linux-x86_64.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/fonttools-4.39.4-py3.11.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/cycler-0.11.0-py3.11.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/contourpy-1.0.7-py3.11-linux-x86_64.egg',
    '/opt/anaconda3/envs/gpaw/lib/python3.11/site-packages/six-1.16.0-py3.11.egg',
]
USER_BASE: '/home/gn/.local' (exists)
USER_SITE: '/home/gn/.local/lib/python3.11/site-packages' (exists)
ENABLE_USER_SITE: True

这里的USER_BASE 和USER_SITE其实就是用户自定义的启用Python脚本和依赖安装包的基础路径,从上面的输出可以看到,import xxx时,先找的是 anaconda3/pkgs目录,所以conda安装的包会被import进来。


大部分情况下,二者没有区别,怎么安装都可以work,不过,二者混着装各种package你真的会因为版本冲突而发疯!

conda有严格的检查机制,它会保证你当前装的package安装好之后能work,但是,它只检查用conda安装过的package。 例如,你新安装的package会依赖numpy ,不过你已经安装numpy(e.g., 1.19.2),但是用pip安装的,不好意思,它会认为你没安装,然后用conda再安装一个依赖版本的numpy(e.g., 1.18.5)。这个时候,两个numpy可能就打架了。并且你 pip listconda list显示的numpy版本可能不一致,结果不知道最后运行程序的时候调用了哪个版本的numpy。

这个时候,uninstall可能也卸载不干净,卸了一个还有一个,最后还可能一直list有却是一个空壳。这个时候,快刀斩乱麻的方法,找到anaconda的lib/site-packages/numpy, 手动删掉它!

pip的一个好处是可以安装时既检查conda安装过package的也检查pip安装过的package。 不过,它只负责要什么装什么,不负责能不能把装的一堆packages打通,可能装好不work :(。

一般原则,在新环境中,如果装多个packages,既用到conda,又用到pip,那就先conda 的都装好,再pip,如果能用一种装到底,就不要来回换着用。

二、使用区别

[支持语言]:

pip 是 python 官方推荐的包下载工具,但是只能安装python包 conda 是一个跨平台(支持linux, mac, win)的通用包和环境管理器,它除了支持python外,还能安装各种其他语言的包,例如 C/C++, R语言等

[Repo源]:

pip 从PyPI(Python Package Index)上拉取数据。上面的数据更新更及时,涵盖的内容也更加全面 conda 从 Anaconda.org 上拉取数据。虽然Anaconda上有一些主流Python包,但在数量级上明显少于PyPI,缺少一些小众的包

[包的内容]:

pip 里的软件包为wheel版或源代码发行版。wheel属于已编译发新版的一种,下载好后可以直接使用;而源代码发行版必须要经过编译生成可执行程序后才能使用,编译的过程是在用户的机子上进行的 conda 里的软件包都是二进制文件,下载后即可使用,不需要经过编译

[环境隔离]:

pip 没有内置支持环境隔离,只能借助其他工具例如virtualenv or venv实现环境隔离 conda 有能力直接创建隔离的环境

[依赖关系]:

pip安装包时,尽管也对当前包的依赖做检查,但是并不保证当前环境的所有包的所有依赖关系都同时满足。当某个环境所安装的包越来越多,产生冲突的可能性就越来越大。 conda会检查当前环境下所有包之间的依赖关系,保证当前环境里的所有包的所有依赖都会被满足

[库的储存位置]:

在conda虚拟环境下使用 pip install 安装的库: 如果使用系统的的python,则库会被保存在 ~/.local/lib/python3.x/site-packages 文件夹中;如果使用的是conda内置的python,则会被保存到 anaconda3/envs/current_env/lib/site-packages中 conda install 安装的库都会放在anaconda3/pkgs目录下。这样的好处就是,当在某个环境下已经下载好了某个库,再在另一个环境中还需要这个库时,就可以直接从pkgs目录下将该库复制至新环境而不用重复下载

三、使用总结

推荐使用conda创建虚拟环境,能用conda安装的就先用conda,不行再使用pip安装。