Macos 从bash脚本调用conda源激活

Macos 从bash脚本调用conda源激活,macos,shell,virtualenv,conda,Macos,Shell,Virtualenv,Conda,我正试图通过bash脚本激活我的conda env。即使脚本运行良好,并且我的路径似乎在脚本中发生了更改,但在脚本终止后,它会以某种方式重置。我可以从cmd行调用source activate test,它工作正常。下面是一个示例和输出 脚本: PycharmProjects/test » cat ./example.sh echo "before calling source: $PATH" source activate test echo "after calling source: $P

我正试图通过bash脚本激活我的conda env。即使脚本运行良好,并且我的路径似乎在脚本中发生了更改,但在脚本终止后,它会以某种方式重置。我可以从cmd行调用
source activate test
,它工作正常。下面是一个示例和输出

脚本:

PycharmProjects/test » cat ./example.sh
echo "before calling source: $PATH"
source activate test
echo "after calling source: $PATH"
./example.sh
before calling source: /Use rs/me/miniconda3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin

discarding /Users/me/miniconda3/bin from PATH
prepending /Users/me/miniconda3/envs/test/bin to PATH

after calling source: /Users/me/miniconda3/envs/test/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin`
输出:

PycharmProjects/test » cat ./example.sh
echo "before calling source: $PATH"
source activate test
echo "after calling source: $PATH"
./example.sh
before calling source: /Use rs/me/miniconda3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin

discarding /Users/me/miniconda3/bin from PATH
prepending /Users/me/miniconda3/envs/test/bin to PATH

after calling source: /Users/me/miniconda3/envs/test/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin`
但是如果在脚本完成后我
echo$PATH
,您可以看到
$PATH
没有更改(即no
/Users/me/miniconda3/envs/test/bin
):

PycharmProjects/test»echo$PATH/Users/me/miniconda3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/sbin:/Library/TeX/texbin
请参见下面的链接

以下是该网站的片段

这是因为环境变量只传递给子对象 过程。没有一种内置的设置环境的方法 父shell的变量。这在大多数情况下是好的,可以防止 程序不会影响其所在的操作环境 打电话来


在运行bash shell的Mac OSX上,我发现了以下方法:

#!/bin/bash
source /Users/yourname/anaconda/bin/activate your_env
python --version # example way to see that your virtual env loaded as expected
确保使用以下命令创建脚本化可执行文件:

chmod +x yourscript.bash

在较新版本的conda(4.6+)上,我注意到以下功能:

eval "$(conda shell.bash hook)"
conda activate <env-name>
eval“$(conda shell.bash hook)”
康达激活

echo$PATH
在哪里说的?您是否将
example.sh
作为脚本本身(即
/example.sh
)运行?而不是
source
ing它(即
source-example.sh
)?以脚本(./example.sh)的形式运行
example.sh
。脚本运行完毕后,我调用了
echo$PATH
,以显示$PATH实际上没有更改。将其作为脚本运行时,更改将随着shell运行脚本而停止。这就是为什么您首先需要
source
激活脚本,使其应用于正在运行的脚本/shell。脚本的可能副本修复了它。请您解释一下为什么我们需要
eval“$(conda shell.bash hook)”
conda shell.bash hook
返回一个bash字符串。“我想你可以把这个问题纠正到一个文件中,然后找到那个文件的源代码,但是评估它更容易/更快。”AnthonyScopatz解释了你在做什么,但没有解释为什么
conda activate
在没有该eval表达式的情况下工作正常,因此仍然不清楚为什么要这样做。当
conda activate
出错请求运行
conda init
时,这里的eval表达式使它在没有conda init的情况下工作。
CommandNotFoundError:您的shell没有正确配置为使用“conda activate”。
它在ubuntu 18,conda 4.9上对我有效。这比Anthony Scopatz方法花费的时间更少。原因不在我的理解范围之内。