【问题标题】:Conda does not set paths when activating environment激活环境时,Conda 不设置路径
【发布时间】:2019-08-28 18:52:45
【问题描述】:

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

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

当我启动一个新的 shell 时,基础环境被激活。相关的 我的.bashrc 的 sn-p 如下所示:

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 目录之后。

我尝试通过将以下 sn-p 附加到 .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 以获得正确定义的 PATH 环境变量?

【问题讨论】:

  • 你是如何启动 shell 的 - 是否还有一个 .bash_profile 也正在加载(例如,bash -l)? conda init -vv -d 输出什么?它是否建议对.bashrc 进行进一步更改?另外,您是否自己在 .bashrc 中编写了该部分的代码? - 它与我以前见过的标准模板不匹配。 conda info 的输出可能很有用。
  • 感谢您的评论。你提到.bash_profile 让我走上了正轨。

标签: bash anaconda conda tmux


【解决方案1】:

我在原始问题中遗漏了三个对解决方案至关重要的部分。

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

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

对此有三种解决方案:

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

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

【讨论】:

    【解决方案2】:

    这与 Bash 初始化文件有关。默认情况下,~/.bashrc 用于 交互式、非登录 shell。它不会在登录 shell 中获取。 Tmux 默认使用 login shell。因此,由 tmux 启动的 shell 会跳过 ~/.bashrc

    default-commandshell-command

    默认为空字符串,指示 tmux 使用 default-shell 选项的值创建登录 shell

    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 中的源文件

    在其他情况下,奇怪的交互式、非登录加载要求也会让人们感到困惑。 最佳解决方案是将~/.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 用户在配置文件中进行设置。

    参考文献

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多