首页 > 系统相关 >一键掌控:Shell脚本自动化安装与管理Conda环境的艺术

一键掌控:Shell脚本自动化安装与管理Conda环境的艺术

时间:2024-03-23 20:29:33浏览次数:28  
标签:Shell name 环境 一键 conda env override Conda

前面写了个博客《conda:解决多项目开发环境配置的神器!》简单介绍了 Conda 的安装和基本命令,在做开发时经常会使用 Conda 建立多个应用环境,Conda 的命令虽不复杂,但还是有时会弄混,所以就考虑写个脚本,一条指令创建环境。没啥难度,仅仅是方便自己使用而已。

1 创建 Conda 应用环境的主要流程

1.1 检查系统是否安装了 Conda 这个虚拟环境工具

1.2 检查要建立的环境名称是否存在

  • 如果环境存在,则判断命令行参数里是否指定覆盖环境,如果指定覆盖则去执行覆盖(进入下面的 1.3),否则就提示用户“改名或在命令行参数里设置覆盖选项(override)”
  • 如果环境不存在,直接去创建并激活环境

1.3 以覆盖的方式安装

  • 先检查系统现有的环境是否处于激活(activate)状态,如果是激活状态,则先取消激活(deactivate),再在删除该环境(remove)后,创建 (create)和激活(activate)指定环境
  • 如果指定的环境在系统里没有处于激活状态,则直接删除该环境(remove)后,创建 (create)和激活(activate)指定环境

2 脚本包含的几个功能点(函数)

脚本的功能点,基本都由对应的函数来实现。
注意:函数的返回值,可以在主函数调用此函数后,用$?获得(参考后面完整代码)

2.1 检查是否安装了 Conda

  • 函数名:check_conda_installed
  • 返回值:0表示conda已安装,否则为1(可以根据需要设定,只要非零就可以,下同)
check_conda_installed(){
    # 尝试执行conda命令
    conda --version > /dev/null 2>&1
}

2.2 检查环境是否存在

  • 函数名:check_env_exists
  • 返回值:0 存在,1 不存在
check_env_exists(){
    conda env list | grep -q "^$env_name\s"
}

2.3 当环境存在时,判断 override 参数

    if [ "$override" = "override" ]; then # 是否覆盖
        override_env
    else
        echo "环境 $env_name 已存在!解决方法:"
        echo " 1. 请改名后再安装;"
        echo " 2. 或者使用下面的命令覆盖安装:"
        echo "    source installenv.sh $env_name override"
    fi

2.4 当环境存在时,检查环境是否在激活状态

  • 函数名:check_env_activated
  • 返回值:0 表示激活,1 表示未激活
  • 代码简要说明:
    $CONDA_DEFAULT_ENV 为 Conda 变量,值为当前激活的环境的名称;当 $CONDA_DEFAULT_ENV 和 $env_name 的值相同时,表示指定的环境在激活状态。
check_env_activated(){
    if [[ -n "$CONDA_DEFAULT_ENV" ]]; then
        if [[ "$CONDA_DEFAULT_ENV" = "$env_name" ]]; then
            return 0 # 环境已激活
        else
            return 1 # 环境未激活
        fi
    else
        return 1 # 环境未激活
    fi
}

2.5 此脚本用到的 Conda 命令参考:

conda --version # 获取 Conda 版本,可以根据此命令的返回值判断 Conda 是否安装
conda env list # 列举 Conda 安装了哪些环境
conda create -n $env_name [python=$python_version] -y # 创建环境,此例指定要安装python及版本,可选
conda activate $env_name # 激活环境
conda deactivate # 将当前环境设置为非激活状态
conda remove --name $env_name --all -y # 删除环境

3 脚本内容

此脚是为了在开发时减少配置 Conda 开发环境的时间,并不是作为通用工具来开发的,所以脚本并没有考虑健壮性,最好只用来做测试,避免造成不可预见的损失。您可以根据需要在此脚本基础上进行完善。

下面是完整代码

#!/bin/bash
# 此脚本使用 Conda 安装环境

#用法:
# ./installenv.sh [env_name] [override]
# 上面的两个参数:
#     env_name 为环境名,必须要有,且必须是第一个参数
#     override 为是否覆盖,可选,默认为 "no",需要覆盖必须为 "override"字符串

env_name=$1 # 环境名
override=$2 # 是否覆盖

# 入口函数,用来安装环境
main() {
    if [ -z "$env_name" ]; then
        echo ""
        echo "!!! 请输入变量名"
        echo "用法: "
        echo "source installenv.sh [env_name] [override]"
        echo "#     env_name 为环境名,必须要有,且必须是第一个参数"
        echo "#     override 为是否覆盖,可选,默认为 \"no\",需要覆盖必须为 \"override\"字符串"
        echo ""
        return 1
    fi
    if [ -z "$override" ]; then
        override="no"
    fi
    check_conda_installed # 检查 Conda 是否安装
    if [ $? -ne 0 ]; then # Conda  未安装
        echo "没有安装 Conda,请安装!"
        return 1
    fi
    check_env_exists # 检查环境是否存在
    if [ $? -ne 0 ]; then # 指定的环境不存在
        conda create -n $env_name python=3.9.12 -y # 创建环境
        conda activate $env_name # 激活环境
        return 0
    fi
    if [ "$override" = "override" ]; then # 是否覆盖
        override_env
    else
        echo "环境 $env_name 已存在!解决方法:"
        echo " 1. 请改名后再安装;"
        echo " 2. 或者使用下面的命令覆盖安装:"
        echo "    source installenv.sh $env_name override"
    fi
}

# 检查conda是否安装
# 返回值为0表示conda已安装,否则为1
check_conda_installed(){
    # 尝试执行conda命令
    conda --version > /dev/null 2>&1
}

# 检查环境是否存在
# 返回值:0 存在,1 不存在
check_env_exists(){
    conda env list | grep -q "^$env_name\s"
}

# 覆盖环境
override_env(){
    check_env_activated
    if [ $? -eq 0 ]; then # 环境已激活
        conda deactivate
    fi
    conda remove --name $env_name --all -y # 删除环境
    conda create -n $env_name python=3.9.12 -y # 创建环境
    conda activate $env_name # 激活环境
}

# 检查环境是否激活
# 返回值为0表示激活,为1表示未激活
check_env_activated(){
    if [[ -n "$CONDA_DEFAULT_ENV" ]]; then
        if [[ "$CONDA_DEFAULT_ENV" = "$env_name" ]]; then
            return 0 # 环境已激活
        else
            return 1 # 环境未激活
        fi
    else
        return 1 # 环境未激活
    fi
}

# 安装指定环境
main # 安装指定环境

4 使用方法

在执行此脚本时,需要在Shell(终端)里以source(或者 .)的方式来运行,否则会出错,具体原因看下面“通义灵码”的解释

在 Shell 脚本中直接使用 conda 命令有时可能无法访问到 Conda 的环境变量和命令,这是因为 Conda 通过修改shell的环境变量(特别是 PATH 变量)来切换不同的环境。当你在一个新的 Shell 会话中直接运行 conda 命令时,如果该 Shell 会话没有经过 Conda 的初始化,就可能找不到 Conda 命令。

看得有点晕吧?没关系,说人话:当你需要在脚本中执行 conda 命令以管理环境或安装软件包时,一种常见的做法是通过 source 命令(在Bash中也可以写作.)来执行 conda 的初始化脚本,确保conda的环境变量设置正确。再直观一点,只要按下面的写法执行就没问题了:

source ./installenv.sh [env_name] [override]

5 题外话

最近编码一直使用“通义灵码”,那个代码联想功能简直就是逆天了,基本上你想到的没想到的代码他都给你联想了,这样写代码效率简直爆棚,语法错误和 bug,也非常少了。
我让她简单给我分析一下代码,她说了下面的话,由于太佩服了,所以就作为题外话,截个图分享出来:
在这里插入图片描述
看了上面通义灵码的代码分析,你能忍住不安装一个 AI编码助手 插件吗?这种插件很多,可以根据需要选择,建议还是试试吧!

标签:Shell,name,环境,一键,conda,env,override,Conda
From: https://blog.csdn.net/weixin_42398461/article/details/136964733

相关文章

  • Python虚拟环境conda的安装使用
    文章目录conda虚拟环境的详细步骤和注意事项:**安装Conda****创建Conda虚拟环境****激活Conda虚拟环境****安装Python包****管理Conda环境****其他优势与特性**相较于`venv`,使用`conda`管理虚拟环境有以下优势:**性能****资源占用****其他性能与资源相关因素****结论**......
  • shell脚本基础改造
    一、基础的shell脚本格式#!/bin/bash2#3#********************************************************************4#Author:LJH5#QQ:......
  • 希尔排序(Shell Sort)
    publicstaticvoidmain(String[]args){int[]arr={9,6,8,4,2,5,7,3,1};int[]arr2={9,6,8,4,2,5,7,3,1};shellSort(arr);System.out.println("=====================");shellSort2(arr2);}/***shell排序,插入排序......
  • shell检测文件是windows格式还是unix
    Shell可以检测文件是Windows格式还是Unix格式。有多种方法可以实现这一目的。一种常用的方法是使用cat命令结合-A选项来查看文件的特殊字符。在Unix或Linux系统中,如果文件的行尾是以^M$结束的,那么它就是Windows(DOS)格式,因为^M代表回车符(\r)。而如果行尾只是以$结束,那么它就是Unix格......
  • 动态水印也能去除?ProPainter一键视频抠图整合包下载
    ProPainter是一个基于E2FGVI实现的AI视频编辑工具,它结合了增强的传播和Transformer机制,能够快速高效地进行视频修复和水印去除功能特点· 对象移除:智能地检测和移除视频中的动态物体,对于去除不需要的元素或错误的特效非常有用·对象补全:填补视频中缺失的区域,通常用于修......
  • 动态水印也能去除?ProPainter一键视频抠图整合包下载
    ProPainter是一个基于E2FGVI实现的AI视频编辑工具,它结合了增强的传播和Transformer机制,能够快速高效地进行视频修复和水印去除功能特点· 对象移除:智能地检测和移除视频中的动态物体,对于去除不需要的元素或错误的特效非常有用 ·对象补全:填补视频中缺失的区域,通常用于修......
  • 嵌入式开发学习---Linux所有命令、shell命令
    Linux命令系统维护命令df命令df-Th:查看磁盘使用情况文件系统 文件类型大小已使用可用使用比例挂载点FilesystemTypeSizeUsedAvailUse%Mountedon/dev/sda1ext419G6.6G12G38%/mount......
  • Shell 中 $ 关于脚本参数的几种用法
    基本语法$n   (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})$#   (功能描述:获取所有输入参数个数,常用于循环)。$*   (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)$@ (功能描......
  • 一键解决App应用分发下载问题
    本文深入分析了App应用分发下载失败的常见原因,并提供了针对网络连接问题、服务器故障、设备存储空间不足、文件大小和格式不受支持等方面的解决方法。此外,还附带了一个在线证书制作工具的案例演示,旨在帮助开发者和用户解决应用分发下载失败问题,提升使用体验。移动应用开发过程中经......
  • 定时备份docker日志(shell方式,可能存在丢部分日志)
    创建sh文件 vi~/backup_docker_log.sh #!bin/shif[!-d"/logs"];thenmkdir"/logs"ficd/logs/forfilein/var/lib/docker/containers/*doiftest-d$filethenecho$file是目录forlogfilein$file/*.log......