这两个操作的区别到底是什么?
source activate python3_env && python my_script.py
和
~/anaconda3/envs/python3_env/bin/python my_script.py
吗?
激活环境似乎在$ PATH中添加了一些变量,但是第二种方法似乎访问了python3_env
中安装的所有模块。引擎盖下还有其他事情吗?
答案 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 theprefix
to thePATH
的_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
可能会产生完全不同的结果。