Conda:激活环境会发生什么?

时间:2018-02-02 14:42:24

标签: path conda

如何运行source activate <env-name>更新$ PATH变量?我一直在查看CONDA-INSTALLATION/bin/activate脚本,并且不明白conda如何更新我的$ PATH变量以包含最近激活的环境的bin目录。我在哪里可以找到conda用来添加$ PATH变量的代码。

1 个答案:

答案 0 :(得分:7)

免责声明:我不是conda开发者,我不是Bash专家。以下说明是基于我对代码的跟踪,我希望我能做到这一点。此外,下面的所有链接都是在撰写此答案时(7cb5f66)与主提交的永久链接。在将来的提交中,行为/行可能会发生变化。小心:前方的深兔洞!

请注意,此解释适用于命令source activate env-name,但在conda&gt; = 4.4中,激活环境的推荐方法是conda activate env-name。我想如果使用conda activate env-name,你应该在我们进入cli.main函数的部分找到解释。

对于conda&gt; = 4.4,&lt; 4.5,查看CONDA_INST_DIR/bin/activate,我们会找到倒数第二行和最后一行(GitHub link):

. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
_conda_activate "$@"

第一行来源conda.sh目录中的脚本$_CONDA_ROOT/etc/profile.d,该脚本定义_conda_activate bash函数,我们传递参数$@,这基本上是我们传递给activate脚本的所有参数。

在兔子洞的下一步,我们查看$_CONDA_ROOT/etc/profile.d/conda.sh并找到(GitHub link):

_conda_activate() {
# Some code removed...
    local ask_conda
    ask_conda="$(PS1="$PS1" $_CONDA_EXE shell.posix activate "$@")" || return $?
    eval "$ask_conda"

    _conda_hashr
}

关键是第ask_conda=...行,尤其是$_CONDA_EXE shell.posix activate "$@"。在这里,我们使用参数shell.posixactivate运行conda可执行文件,然后传递给此函数的其余参数(即我们要激活的环境名称)。

进入兔子洞的另一步......从这里开始,conda可执行文件调用cli.main function,并且由于第一个参数以shell.开头,它从{{{{}}导入main函数1}}。此函数创建conda.activate类的实例(在同一文件中定义)和runs the execute method

Activator方法处理参数和stores the passed environment name into an instance variable,然后决定activate command has been passed,因此runs the activate method

进入兔子洞的另一步...... execute方法调用build_activate method,调用another function来处理环境名称以查找环境前缀(即,哪个文件夹是环境在)。最后,通过build_activate method adds the prefix to the PATH _add_prefix_to_path method。最后,需要运行以“激活”环境的activate方法returns a dictionary

又深入了一步......从build_activate方法返回的字典被_yield_commands method处理成shell命令,这些命令被传递到build_activate方法。 _finalize方法返回运行the _finalize method的值,该值返回临时文件的名称。临时文件具有设置所有适当环境变量所需的命令。

现在,退出,在activate函数中,activate.main方法的返回值(即临时文件的名称)为printed to stdout。此临时文件名存储在execute Bash函数中的Bash变量ask_conda中,最后,临时文件由_conda_activate Bash函数执行。

唷!我希望我把一切都做对了。正如我所说,我不是一个conda开发人员,而且远非Bash专家,所以请原谅我所采取的任何不完全正确的解释捷径。只需发表评论,我将很乐意解决它!

我还应该注意,在conda&gt; = 4.4中激活环境的推荐方法是eval,这是错综复杂的原因之一 - 激活主要在Python中处理,而(I以前在Bash / CMD中直接处理它或多或少。