检查 conda env 是否存在,如果不存在则在 bash 中创建

cdu*_*dub 7 python bash conda

我有一个构建脚本来运行一个简单的 python 应用程序。我正在尝试将其设置为任何已安装 conda 并在其 PATH 中的用户都可以运行它。没有其他先决条件。我已经基本完成了这一点,但希望提高回访用户的效率。

构建运行.sh

conda init bash
conda env create --name RUN_ENV --file ../run_env.yml -q --force
conda activate RUN_ENV
python run_app.py
conda deactivate
Run Code Online (Sandbox Code Playgroud)

我想让脚本检查 RUN_ENV 是否已经存在并激活它,而不是每次都强制创建它。我试过

ENVS=$(conda env list | awk '{print }' )
if [[ conda env list = *"RUN_ENV"* ]]; then
   conda activate RUN_ENV
else 
   conda env create --name RUN_ENV --file ../run_env.yml -q
   conda activate RUN_ENV
   exit
fi;
python run_app.py
conda deactivate
Run Code Online (Sandbox Code Playgroud)

但它总是返回 false 并尝试创建 RUN_ENV

kev*_*nls 9

更新2022

我最近一直收到点赞。所以我要强调的是,这种方法总体上并不是原生的“conda”,并且可能不是最好的方法。就像我最初所说的,我不使用 conda。请酌情采纳我的建议。

相反,请参阅@merv 在建议使用该--prefix标志的问题中的评论

另外请查看文档以获取更多详细信息

注意:您始终可以在 bash 脚本中使用一个函数,通过非常具体的标志来重复命令调用

例如

function PREFIXED_CONDA(){
   action=${1};
   # copy $1 to $action;
   shift 1;
   # delete first argument and shift remaining indeces to the left
   conda ${action} --prefix /path/to/project ${@}
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何conda env list工作(我不使用 Anaconda);你当前的if测试很模糊

但我冒险猜测这就是你要找的

#!/usr/bin/env bash
# ...
find_in_conda_env(){
    conda env list | grep "${@}" >/dev/null 2>/dev/null
}

if find_in_conda_env ".*RUN_ENV.*" ; then
   conda activate RUN_ENV
else 
# ...
Run Code Online (Sandbox Code Playgroud)

您也可以这样做,而不是将其放入单独的函数中

# ...
if conda env list | grep ".*RUN_ENV.*" >/dev/null 2>&1; then
# ...
Run Code Online (Sandbox Code Playgroud)

如果您使用命令分组,则会获得整洁和清晰的加分

# ...
if { conda env list | grep 'RUN_ENV'; } >/dev/null 2>&1; then
# ...
Run Code Online (Sandbox Code Playgroud)

if只需检查退出代码即可。只要至少有一个与所提供的模式匹配,就会以(成功)退出grep;0这在以下情况下评估为“true”if这在声明

(grep即使模式只是“RUN_ENV”,也会匹配并成功;))


awk的部分实际上ENVS=$(conda env list | awk '{print }' )什么也不做。我希望输出采用表格格式,但{print }不进行过滤,我相信您正在寻找{print $n}列n号或awk /PATTERN/ {print}模式可能在哪里RUN_ENV,并且仅打印具有模式的行。

但即便如此,将表存储在字符串变量中也会很混乱。你可能想要一个数组。

然后来到你的if- 条件,它在语法上是明显错误的。

  • 该[[构造用于比较值:整数、字符串、正则表达式
  • 但在我们的左边=有一个命令conda env list
    • 我相信这也是$ENVS
  • 因此我们可以假设你的意思是[[ "${ENVS}" == *"RUN_ENV"* ]]
    • 或者交替地[[ $(conda env list) == *"RUN_ENV"* ]]
  • 但仍然,正则表达式与表匹配......在我看来不是很直观
  • 但它有效......有点
  • 正则表达式匹配的正确干净语法是
    • [[ ${value} =~ /PATTERN/ ]]