在ubuntu下linux中,如何在shell脚本中使用conda activate?编写了shell代码无法自动加载.bashrc

问题描述

前两天换了新主机,在主机中启用conda虚拟环境,无法启用,需要初始化conda,但是bashrc有初始化代码

怀疑是没有启动bashrc,因此在bashrc中最后一行加入

echo ".bashrc loaded"

运行shell脚本,没有输出,确定是无运行

检查bashrc文件,发现开头有

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这是为了防止bashrc在非交互界面自动启动的,于是将echo代码写在这里的前面

还是没用

手动加载bashrc呢?

source ~/.bashrc

确实打印输出了,但是依然不完美

  1. bashrc文件中有防止非交互运行的代码
  2. bash启动一个shell脚本,会启用一个子shell来运行,而子shell会继承父shell的环境变量(?或者只是conda环境)
  3. 在shell脚本的开始手动初始化conda吧

更新:在第二天解决了这个问题,询问了chatgpt

首先,发现source activate 是可用的

询问了chatgpt

其次,询问了chatgpt,应该使用

# 初始化 Conda 环境
eval "$(conda shell.bash hook)"
conda activate xxx

为什么eval "$(conda shell.bash hook)"?官方文档具体在哪里?

ChatGPT 说:

ChatGPT

解释:eval "$(conda shell.bash hook)" 的作用

当你在 shell 中运行 eval "$(conda shell.bash hook)" 时,Conda 会动态注入所需的环境配置脚本,从而允许使用 conda activateconda deactivate 命令。这是因为:

  1. Conda 初始化环境

    • conda activate 命令在新版 Conda 中(4.4 版本及之后)不再是简单的 shell 函数调用,而是依赖于 Conda 的 hook 脚本来完成环境切换。这个脚本需要在当前 shell 环境中被加载,eval "$(conda shell.bash hook)" 就是实现这一加载的命令。
  2. 避免修改全局配置文件

    • 使用 conda init 会修改用户的 ~/.bashrc~/.zshrc 文件,从而在每次打开新的 shell 时自动初始化 Conda 配置。而 eval "$(conda shell.bash hook)" 是一种更灵活的方式,不需要修改全局配置文件,可以直接在脚本中使用。
  3. shell hook 的作用

    • conda shell.bash hook 会输出一段 shell 脚本,eval 命令会执行这段脚本,使得 conda 命令可以在当前 shell 会话中正确工作。这段脚本主要包括环境路径设置和函数定义等内容。

官方文档位置

你可以在 Conda 官方文档的 "Command Reference" 和 "Managing environments" 部分找到关于 shell hook 的说明:

  • Shell Hook 文档:Conda Shell Hook 官方文档

文档片段示例

根据官方文档:

To enable the conda activate command in a script or non-interactive shell, run:

bash

eval "$(conda shell.bash hook)" conda activate myenv

This command initializes Conda's functions in the current shell session without requiring a restart.

解决问题的根本原因

如果你不使用 eval "$(conda shell.bash hook)",那么 conda activate 会在非交互式 shell 中失效,这是因为:

  • 在非交互式 shell 中(例如 shell 脚本中),默认不会加载 ~/.bashrc 配置文件,而这个文件通常包含了 Conda 的初始化配置。
  • eval "$(conda shell.bash hook)" 在当前 shell 会话中动态加载了这些初始化配置,使 conda activate 可以正常工作。

推荐用法

在 shell 脚本或非交互式环境中,使用以下模板来激活 Conda 环境:

bash

#!/bin/bash # 初始化 Conda 环境 eval "$(conda shell.bash hook)" # 激活目标环境 conda activate DVR # 继续执行其他命令 python your_script.py

这种方式是 Conda 官方推荐的做法,兼容性好且避免了修改全局配置文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值