激活conda env与从conda env调用python解释器

时间:2018-08-17 18:18:17

标签: environment-variables anaconda conda

这两个操作的区别到底是什么?

source activate python3_env && python my_script.py~/anaconda3/envs/python3_env/bin/python my_script.py吗?

激活环境似乎在$ PATH中添加了一些变量,但是第二种方法似乎访问了python3_env中安装的所有模块。引擎盖下还有其他事情吗?

1 个答案:

答案 0 :(得分:2)

您是正确的,激活环境会将一些目录添加到PATH环境变量中。特别是,这将允许首先运行环境中安装的任何二进制文件或脚本,而不是基本环境中的二进制文件或脚本。例如,如果您已经将IPython安装到您的环境中,则激活该环境可以让您编写

ipython

在环境中启动IPython,而不是

/path/to/env/bin/ipython

此外,环境可能具有添加或编辑在激活环境时执行的其他环境变量的脚本(请参见conda docs)。这些脚本可以对shell环境进行任意更改,甚至可以更改PYTHONPATH来更改从中加载软件包的位置。

最后,我写了一个非常详细的答案,说明那里的代码中到底发生了什么:Conda: what happens when you activate an environment?尽管可能还是不是最新的。答案的相关部分是:

  

...通过build_activate method adds the prefix to the PATH_add_prefix_to_path method。最后,需要运行build_activate方法returns a dictionary来“激活”环境。

     

再往前走一步……从build_activate方法返回的字典由_yield_commands method处理成shell命令,并传递到_finalize方法中。 activate方法通过运行the _finalize method返回值,该值返回临时文件的名称。临时文件具有设置所有适当的环境变量所需的命令。

     

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

因此您可以看到,根据环境的不同,运行conda activate python3_env && python my_script.py~/anaconda3/envs/python3_env/bin/python my_script.py可能会产生完全不同的结果。