Conda 在激活环境时不设置路径

Conda does not set paths when activating environment

启动新的shell时,没有配置PATH环境变量 适当地。目录 anaconda3/binminiconda3/bin 在第二个 仅位置,而不是 PATH 变量中的第一个位置。这可以是 由 conda deactivate 解决并再次激活它。

这个问题已经被问过好几次了(例如here and here) 但是现有的问题要么很老,要么集中在使用 source activate env-name。总而言之,我没有找到解决我的问题的答案 问题。

当我启动一个新的 shell 时,基础环境被激活。相关的 我的 .bashrc 中的片段是这样的:

condaexe="/home/$USER/.miniconda3/bin/conda"
condash="/home/$USER/.miniconda3/etc/profile.d/conda.sh"
__conda_setup="$($condaexe 'shell.bash' 'hook' 2> /dev/null)"
# shellcheck disable=SC2181
if [[ $? -eq 0 ]]
then
    eval "$__conda_setup"
elif [[ -f "$condash" ]]
then
    source "$condash"
fi
unset __conda_setup condaexe condash

那么,PATH变量定义如下:

(base)$ echo $PATH
/home/user/.local/bin:/home/user/.miniconda3/bin:/home/user/.miniconda3/condabin:/home/user/workspace/my-project/:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
(base)$ conda deactivate && echo $PATH
/home/user/.local/bin:/home/user/.miniconda3/condabin:/home/user/workspace/my-project/:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ conda activate base && echo $PATH
/home/user/.miniconda3/bin:/home/user/.local/bin:/home/user/.miniconda3/condabin:/home/user/workspace/my-project/:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
(base)$

注意/home/user/.local/bin被包含了两次;曾经和曾经 在 Miniconda3 目录之后。

我试图通过将以下片段附加到 .bashrc 来调试问题:

echo $CONDA_PROMPT_MODIFIER
echo $PATH

这会产生

(base)
/home/user/.miniconda3/bin:/home/user/.miniconda3/condabin:/home/user/workspace/my-project:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

这完全没问题,但不知何故,在 .bashrc 之后被修改了 。 请注意,此处 /home/user/.local/bin 仅包含一次。

这是怎么回事?如何设置 Bash/Conda 以获得正确定义的路径 环境变量?

我在原始问题中遗漏了三个关键的解决方案。

首先,我 运行 我所有的 shell 都在 TMux 中。其次,TMux 来源 .profile。第三,在 .profile 中,一些本地目录(如上述 ~/.local/bin 被盲目地添加到 PATH 中。

综上所述,上述所有奇怪的行为都是有道理的。特别是 PATH 在 ~/.bashrc 末尾正确但在 shell 中不正确现在很明显; ~/.profile.

对其进行了修改

解决这个问题的三种方法:

  1. 手动停用和激活 conda(临时解决方法)
  2. 更挑剔哪些 shells 在 TMux 中启动(非常不方便)
  3. 注释掉 ~/.profile
  4. 中对 PATH 的操作

似乎无法将 TMux 配置为仅来源 ~/.bashrc (reference 1, ),尽管这里也存在一些解决方法。

这与 Bash 初始化文件有关。默认情况下,~/.bashrc 用于 交互式非登录 shell。它不会来自登录 shell。 Tmux 默认使用 login shell。因此,shells 由 tmux skip ~/.bashrc.

启动

default-command shell-command

The default is an empty string, which instructs tmux to create a login shell using the value of the default-shell option.

Bash、

的初始化文件
  1. 登录方式:
    1. /etc/profile
    2. ~/.bash_profile~/.bash_login~/.profile(只有第一个存在)
  2. 互动 非登录:
    1. /etc/bash.bashrc(有些Linux;不在Mac OS X)
    2. ~/.bashrc
  3. 非交互式:
    1. $BASH_ENV
    2. 中的源文件

奇怪的交互、非登录加载要求在其他情况下也会让人们感到困惑。 最佳解决方案 是将 ~/.bashrc 的加载要求更改为 仅交互式 ,这正是某些发行版所采用的,例如 Ubuntu,正在做。

# write content below into ~/.profile, or ~/.bash_profile

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

这应该是您想要的解决方案。我建议每位 Bash 用户在个人资料中设置此设置。

参考资料