从 bash 脚本调用 conda 源激活

我正试图通过 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

87636 次浏览

请看下面的链接,

Digital alsea-how-to-read-and-set-Environmental-and-shell-variable-on-a-linux-vps

下面是该网站的一个片段,

这是因为环境变量只传递给子变量 没有一个固有的方法来设定环境 这在大多数情况下都很好,并且可以防止 程序影响操作环境 电话。

在运行 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>

InteractiveShell

conda activate命令用于 互动 shell 会话。一种解决方案是有意在交互式 shell 中运行脚本。这可以通过一个 shebang (如果计划使用 ./example.sh调用)来完成:

Example.sh

#!/usr/bin/env bash -l
echo "before calling source: $PATH"
## `source activate` is deprecated
conda activate test
echo "after calling source: $PATH"

或者,通过向 shell 指定通过标志:

## bash
bash -l example.sh


## zsh
zsh -i example.sh

所有这些都假设执行用户已经为 shell 运行了 conda init

使用 conda run

对于在环境中执行 程序化的,Conda 提供了 conda run命令。与其在 shell 状态上浪费时间,不如让 Conda 保证在环境中执行:

Crun _ example. sh

echo "PATH outside environment: $PATH"


## printing shell variables is complicated by escaping
conda run -n test bash -c "echo \"PATH inside environment: \${PATH}\""


## but realistic application is usually a non-trivial script
conda run -n test python my_script.py

涉及面向用户的 I/O 的代码通常需要 --live-stream和/或 --no-capture-output标志。