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

时间:2019-08-28 18:52:45

标签: bash anaconda conda tmux

启动新的Shell时,未配置PATH环境变量 正确地。目录anaconda3/binminiconda3/bin位于第二 仅位置,而不是PATH变量中的第一个位置。这可以是 由conda deactivate解决,然后再次激活。

这个问题已经问过几次了(例如herehere) 但是现有的问题要么很老,要么专注于使用 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以获得正确定义的PATH 环境变量?

2 个答案:

答案 0 :(得分:2)

我在原始问题中遗漏了三个要素,它们是解决方案的关键。

首先,我在TMux中运行所有shell。其次,TMux获取.profile。第三,在.profile中,某些本地目录(如前述的~/.local/bin)被盲目地放在PATH之前。​​

总的来说,以上所有奇怪的行为都是有道理的。特别是,PATH在~/.bashrc的末尾是正确的,但在shell中却不明显;在~/.profile之间进行了修改。

有三种解决方案:

  1. 手动停用和激活conda(临时替代方法)
  2. 对TMux内启动哪些shell更加挑剔(非常不方便)
  3. 评论~/.profile中PATH的操作

似乎有些人无法将TMux配置为仅提供~/.bashrcreference 1reference 2)的源代码,尽管这里也存在一些变通办法。

答案 1 :(得分:1)

这与Bash初始化文件有关。默认情况下,在{strong>交互式非登录外壳中使用~/.bashrc。它不会在登录shell中提供。 Tmux默认使用登录外壳。因此,以tmux开始的shell会跳过~/.bashrc

  

default-command shell命令

     

默认值为空字符串,,它指示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用户在配置文件中对此进行设置。

参考