问题描述
前两天换了新主机,在主机中启用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
确实打印输出了,但是依然不完美
- bashrc文件中有防止非交互运行的代码
- bash启动一个shell脚本,会启用一个子shell来运行,而子shell会继承父shell的环境变量(?或者只是conda环境)
- 在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 activate
和 conda deactivate
命令。这是因为:
-
Conda 初始化环境:
conda activate
命令在新版 Conda 中(4.4 版本及之后)不再是简单的 shell 函数调用,而是依赖于 Conda 的 hook 脚本来完成环境切换。这个脚本需要在当前 shell 环境中被加载,eval "$(conda shell.bash hook)"
就是实现这一加载的命令。
-
避免修改全局配置文件:
- 使用
conda init
会修改用户的~/.bashrc
或~/.zshrc
文件,从而在每次打开新的 shell 时自动初始化 Conda 配置。而eval "$(conda shell.bash hook)"
是一种更灵活的方式,不需要修改全局配置文件,可以直接在脚本中使用。
- 使用
-
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 官方推荐的做法,兼容性好且避免了修改全局配置文件。