如何运行source activate <env-name>
更新$ PATH变量?我一直在查看CONDA-INSTALLATION/bin/activate
脚本,并且不明白conda如何更新我的$ PATH变量以包含最近激活的环境的bin目录。我在哪里可以找到conda用来添加$ PATH变量的代码。
答案 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.posix
,activate
运行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中直接处理它或多或少。