03-Python conda 使用 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,这个问题通过下面这条命令可以解决:

1
python -m site

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

1
2
3
4
5
6
7
8
9
10
11
(py3.6) [~/anaconda3/pkgs @ s64]$ python -m site
sys.path = [
'~/anaconda3/pkgs',
'~/anaconda3/envs/py3.6/lib/python36.zip',
'~/anaconda3/envs/py3.6/lib/python3.6',
'~/anaconda3/envs/py3.6/lib/python3.6/lib-dynload',
'~/anaconda3/envs/py3.6/lib/python3.6/site-packages',
]
USER_BASE: '~/.local' (exists)
USER_SITE: '~/.local/lib/python3.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

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

建议

不建议混着装,二者混着装各种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,如果能用一种装到底,就不要来回换着用。


03-Python conda 使用 pip install 和 conda install 的区别
https://flepeng.github.io/021-Python-13-pip、包管理-01-包管理工具-conda-03-Python-conda-使用-pip-install-和-conda-install-的区别/
作者
Lepeng
发布于
2021年7月30日
许可协议