【问题标题】:calling conda source activate from bash script从 bash 脚本调用 conda source activate
【发布时间】:2016-04-04 17:20:24
【问题描述】:

我正在尝试通过 bash 脚本激活我的 conda env。即使脚本运行良好并且我的 PATH 似乎在脚本中发生了更改,但在脚本终止后它会以某种方式重置。我可以从 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`

但是如果我在脚本完成后echo $PATH,你可以看到$PATH没有改变(即没有/Users/me/miniconda3/envs/test/bin):

PycharmProjects/test » echo $PATH /Users/me/miniconda3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin

【问题讨论】:

  • echo $PATH 在哪里这么说的?您是否将example.sh 作为脚本本身运行(即./example.sh)?而不是sourceing 它(即source example.sh)?
  • 以脚本 (./example.sh) 运行 example.sh。我在脚本运行完成后调用了echo $PATH,只是为了显示 $PATH 实际上并没有改变。
  • 将其作为脚本运行,更改会随着 shell 运行脚本而停止。这就是为什么您首先需要 source 激活脚本以使其适用于正在运行的脚本/shell。
  • 感谢脚本修复它。

标签: macos shell virtualenv conda


【解决方案1】:

请看下面的链接,

digitalocean-how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps

下面是网站的sn-p,

这是因为环境变量只传递给子 过程。没有内置的环境设置方法 父外壳的变量。这在大多数情况下都很好,并且可以防止 程序不会影响它们所在的操作环境 调用。

【讨论】:

    【解决方案2】:

    我发现以下内容可以在运行 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
    

    【讨论】:

    • 它在 ubuntu 18、conda 4.9 上对我有用。它比 Anthony Scopatz 方法花费的时间更少。原因不在我的理解范围内。
    【解决方案3】:

    在最新版本的 conda (4.6+) 上,我注意到以下工作:

    eval "$(conda shell.bash hook)"
    conda activate <env-name>
    

    【讨论】:

    • 你能解释一下为什么我们需要eval "$(conda shell.bash hook)"吗?
    • conda shell.bash hook 返回一个 bash 字符串。我想你可以把它写成一个文件,然后获取那个文件,但是评估它更容易/更快。
    • @AnthonyScopatz 这解释了你在做什么,但不是为什么。 conda activate &lt;env&gt; 没有那个 eval 表达式就可以正常工作,所以仍然不清楚你为什么要这样做。
    • conda activate 错误请求conda init 运行时,这里的eval 表达式使它在没有conda init 的情况下工作。
    • 获取:CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2016-10-23
    • 2018-09-11
    • 2017-07-17
    • 2021-04-11
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多