如何运行source activate <env-name>更新$ PATH变量?我一直在查看CONDA-INSTALLATION/bin/activate脚本并且不明白conda如何更新我的$ PATH变量以包含最近激活的环境的bin目录.我在哪里可以找到conda用来添加我的$ PATH变量的代码.
dar*_*ith 10
免责声明:我不是conda开发人员,我不是Bash专家.以下说明是基于我对代码的跟踪,我希望我能做到这一点.此外,下面的所有链接都是在写这个答案(7cb5f66)时与主提交的永久链接.在将来的提交中,行为/行可能会发生变化.小心:前方深深的兔子洞!
请注意,此解释适用于该命令source activate env-name,但在conda> = 4.4中,激活环境的推荐方法是conda activate env-name.我想如果一个人使用conda activate env-name,你应该在我们进入cli.main函数的部分找到解释.
对于conda> = 4.4,<4.5,查看CONDA_INST_DIR/bin/activate,我们找到倒数第二行和最后一行(GitHub链接):
. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
_conda_activate "$@"
Run Code Online (Sandbox Code Playgroud)
第一行源脚本conda.sh在$_CONDA_ROOT/etc/profile.d目录中,该脚本defins的_conda_activatebash的功能,这是我们传递参数$@这基本上是所有的,我们传递给的参数activate脚本.
在兔子洞的下一步,我们看看$_CONDA_ROOT/etc/profile.d/conda.sh并找到(GitHub链接):
_conda_activate() {
# Some code removed...
local ask_conda
ask_conda="$(PS1="$PS1" $_CONDA_EXE shell.posix activate "$@")" || return $?
eval "$ask_conda"
_conda_hashr
}
Run Code Online (Sandbox Code Playgroud)
关键是那条线ask_conda=...,特别是$_CONDA_EXE shell.posix activate "$@".在这里,我们用的参数运行畅达可执行文件shell.posix,activate以及随后的访问内容被传递给这个函数的参数剩余部分(即,我们要激活的环境名称).
进入兔子洞的另一步......从这里开始,conda可执行文件调用cli.main函数,并且由于第一个参数开始shell.,它main从中导入函数conda.activate.此函数创建Activator类的实例(在同一文件中定义)并运行该execute方法.
该execute方法处理参数并将传递的环境名称存储到实例变量中,然后确定该activate命令已被传递,因此它运行该activate方法.
进入兔子洞的另一步...该activate方法调用build_activate方法,该方法调用另一个函数来处理环境名称以查找环境前缀(即环境所在的文件夹).最后,该build_activate方法将prefixPATH via 添加到 via _add_prefix_to_path方法中.最后,该build_activate方法返回需要运行以"激活"环境的命令字典.
而另一个更深一步......从返回的字典build_activate方法被加工成由shell命令_yield_commands的方法,这是传递到_finalize方法.该activate方法返回运行方法的值,该_finalize方法返回临时文件的名称.临时文件具有设置所有适当环境变量所需的命令.
现在,退出,在activate.main函数中,方法的返回值execute(即临时文件的名称)将打印到stdout.此临时文件名ask_conda在_conda_activateBash函数中存储在Bash变量中,最后,临时文件由evalBash函数执行.
唷!我希望我把一切都做对了.正如我所说,我不是一个conda开发人员,而且远非Bash专家,所以请原谅我所采取的任何不完全正确的解释捷径.只需发表评论,我将很乐意解决它!
我还应该注意,在conda> = 4.4中激活环境的推荐方法是conda activate env-name,这是错综复杂的原因之一 - 激活主要在Python中处理,而(我认为)以前它更多 - 或 -较少直接在Bash/CMD中处理.