# 全面总结 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,这个问题通过下面这条命令可以解决: ```bash python -m site ``` 在我的机器上,会有类似下面输出: ```bash 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 list`与 `conda 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安装。