起因

最近发现conda环境中,不论什么环境,都使用的/home/.local/lib/python3.10/site-packages下的包

而理论上Conda的虚拟环境应该优先使用虚拟环境中的包,比如通过查询which pip可以发现其位置在/opt/anaconda3/bin/pip【正确的】

1
2
(base) xxx@xxx-2:~$ which pip
/opt/anaconda3/bin/pip

而下面的结果是【错误的】

1
2
(base) xxx@xxx-2:~$ which pip
/home/dongli911/.local/bin/pip

原因

原因是PATH的优先级问题

优先级:应该将Conda环境的bin目录置于PATH的最前面,意味着你在使用任何命令时(如pythonpip等),系统都会首先在你当前激活的Conda环境中寻找。

但实际上的$PATH输出如下

1
/home/dongli911/.local/bin:/opt/anaconda3/bin:/opt/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

即/home/dongli911/.local/bin被写在了/opt/anaconda3/bin前面,我们要做的是把$PATH重写

解决

随后发现,不论在~/.bashrc怎么修改$PATH,/home/dongli911/.local/bin还是会在最前面,随后发现

对于登录 shell,~/.bash_profile(或在某些系统上是 ~/.profile)会在每次登录时执行。如果 .bashrc 中的设置被覆盖了,可能是因为这些文件中有进一步的修改。

查看~/.profile,发现到$PATH确实被重写了(如下)

1
2
3
4
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi

在上面的代码后面添加export PATH="/opt/anaconda3/bin:$PATH"即可

1
2
3
4
5
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi
export PATH="/opt/anaconda3/bin:$PATH"