Python-通过 shell 脚本激活 conda env
- 2025-04-01 09:56:00
- admin 原创
- 8
问题描述:
我希望运行一个简单的 shell 脚本来简化一些 conda 环境的管理。在 shell 中通过操作系统激活 conda 环境conda activate
可以linux
正常工作,但在 shell 脚本中会出现问题。有人能告诉我为什么会发生这种情况吗?
重复该问题的示例:
# default conda env
$ conda info | egrep "conda version|active environment"
active environment : base
conda version : 4.6.9
# activate new env to prove that it works
$ conda activate scratch
$ conda info | egrep "conda version|active environment"
active environment : scratch
conda version : 4.6.9
# revert back to my original conda env
$ conda activate base
$ cat shell_script.sh
#!/bin/bash
conda activate scratch
# run shell script - this will produce an error even though it succeeded above
$ ./shell_script.sh
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
$ conda init <SHELL_NAME>
Currently supported shells are:
- bash
- fish
- tcsh
- xonsh
- zsh
- powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
解决方案 1:
我使用'source 命令'来运行 shell 脚本,它起作用了:
source shell_script.sh
解决方案 2:
在 shell 脚本中使用conda activate
或source activate
并不总是有效,并且可能会引发类似这样的错误。一个简单的解决方法是将其放在脚本中的source ~/miniconda3/etc/profile.d/conda.sh
任何命令之上:conda activate
source ~/miniconda3/etc/profile.d/conda.sh # Or path to where your conda is
conda activate some-conda-environment
这是对我有用的解决方案,如果共享脚本,它也会起作用。这也避免了必须使用的问题,conda init
因为在我使用过的一些集群上,系统已初始化,但conda activate
仍然无法在 shell 脚本中工作。
解决方案 3:
错误消息非常有用 - 它告诉您,conda 未在脚本运行的子 shell 中正确设置。为了能够在脚本中使用 conda,您需要(如错误消息所示)conda init bash
先运行(或任何 shell)。conda 的行为及其设置方式取决于您的 conda 版本,但 4.4+ 版本行为的原因是它conda
依赖于通常由 conda shell 本身设置的某些环境变量。最重要的是,此变更日志条目解释了为什么您的conda activate
和deactivate
命令在 4.4 及更高版本中不再按预期运行。
有关此内容的更多讨论,请参阅GitHub 上的官方 conda 问题。
编辑:进一步的研究告诉我,conda init
错误消息中提到的功能实际上是 v4.6.0 的新功能,它允许快速设置环境,以便您可以使用它conda activate
来代替旧的source activate
。但是,它之所以有效,是因为它添加/更改了当前 shell 的几个环境变量,并且还更改了 RC 文件(例如.bashrc
:),并且 RC 文件更改永远不会在当前 shell 中被拾取 - 仅在新创建的 shell 中被拾取。(当然,除非您再次获取 .bashrc)。事实上,conda init --help
说了这么多:
重要提示:运行后
conda init
,大多数 shell 都需要关闭并重新启动才能使更改生效
但是,您显然已经运行了conda init
,因为您可以交互使用conda activate
。事实上,如果您打开 .bashrc,您应该能够看到 conda 添加的几行代码,告诉您的 shell 在哪里查找 conda 命令。但是,您的脚本的问题在于 .bashrc 不是由运行 shell 脚本的子 shell 提供的(有关更多信息,请参阅此答案)。这意味着即使您的非登录交互式 shell 可以看到 conda 命令,您的非交互式脚本子 shell 也看不到 - 无论您调用 多少次conda init
。
这导致了一个猜想(我自己在 Linux 上没有 conda,所以我无法测试它),通过像这样运行你的脚本:
bash -i shell_script.sh
您应该看到conda activate
它正常工作。为什么?-i
是一个 bash 标志,它告诉 shell 您开始以交互模式运行,这意味着它将自动获取您的 .bashrc。这应该足以让您在脚本中使用 conda,就像您正常使用它一样。
解决方案 4:
快速解决方案bash
:将以下初始化脚本添加到您的 Bash 脚本中。
eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"
完毕。
对于其他 shell,请检查你的 shell 的 init conf,复制 shell conf 中的以下内容并将其添加到你的脚本中。
# >>> conda initialize >>>
...
# <<< conda initialize <<<
您还可以使用
conda init --all --dry-run --verbose
获取脚本中所需的初始化脚本。
解释
这与4.6conda init
中的引入有关。conda
引自 conda 4.6 发布日志
Conda 4.4 允许“conda activate envname”。问题是设置 shell 以使用此新功能并不总是那么简单。Conda 4.6 增加了广泛的初始化支持,因此比以往任何时候都有更多 shell 可以使用新的“conda activate”命令。有关更多信息,请阅读“conda init –help”的输出
conda init
自 4.6引入后conda
,conda 只将命令暴露
到“base”中的二进制conda
文件中PATH
,而不是所有二进制文件中。环境切换在所有平台上都通过conda activate env-name
和统一。conda deactivate
但是为了使这些新命令起作用,您必须使用 进行额外的初始化conda init
。
问题在于你的脚本文件在子 shell 中运行,并且conda
未在此子 shell 中初始化。
参考
Conda 4.6 发布
Unix shell 初始化
Shell 启动脚本
解决方案 5:
Github上的这个答案对我有用(我使用的是 Ubuntu,所以它不仅适用于 Windows):
eval "$(conda shell.bash hook)"
conda activate my_env
解决方案 6:
如果您想使用 shell 脚本在另一个 conda 环境中运行另一个 python 文件,只需通过以下命令运行另一个文件。
os.system('conda run -n <env_name> python <path_to_other_script>')
解决方案 7:
我发现上述脚本都没什么用。如果你想在非交互模式下运行 conda,这些脚本就很好,但我想在交互模式下运行它。如果我运行:
conda activate my_environment
在 bash 脚本中它只在脚本中运行。
我发现在 .bashrc 中创建一个别名就可以将目录更改为我正在处理的特定项目,并为我设置正确的 conda 环境。所以我在 .bashrc 中包含:
alias my_environment="cd ~/subdirectory/my_project && conda activate my_environment"
进而:
source ~/.bashrc
然后我只需在命令行中输入:
my_environment
每次我想从事不同的项目时,都要切换到正确的项目和正确的环境。
解决方案 8:
在你的 shell 中简单地执行这样的操作有什么问题:
源 /opt/conda/etc/profile.d/conda.sh
(conda init 仍然标记为实验性的,因此不确定使用它是否是个好主意)。
解决方案 9:
尝试从 C++ 或 Python 文件激活 conda env 时,我也遇到了完全相同的错误。我通过绕过 conda activate 语句并使用特定 conda env 的绝对路径解决了这个问题。
对我来说,我使用 conda 设置了一个名为“testenv”的环境。
我使用以下方法搜索了所有 Python 环境
whereis python | grep 'miniconda'
它返回了一个 Python 环境列表。然后我使用以下命令运行 my_python_file.py。
~/miniconda3/envs/testenv/bin/python3.8 my_python_file.py
您也可以在 Windows 上执行同样的事情,但查找 python 和 conda python 环境有点不同。
解决方案 10:
我刚刚遵循了类似hong-xu的解决方案
因此,要运行一个使用参数调用脚本并使用特定 conda 环境的 shell 命令:
从 jupyter 单元来看,过程如下:
p1 = <some-value>
run = f"conda run -n {<env-name>} python {<script-name>.py} \n --parameter_1={p1}"
!{run}
解决方案 11:
问题是,当您运行 bash 脚本时,会创建一个未正确初始化的新 (linux) shell 环境。如果您打算激活 conda 环境,然后通过脚本运行 python,则可以按照接受的解决方案中讨论的那样正确初始化创建的 shell 环境。
但是,如果您想在完成此脚本后让 conda 环境处于活动状态,那么这将行不通,因为 conda 环境在新 shell 上已经发生了变化,并且您在完成脚本后退出该 shell。 将其视为运行bash
,然后conda activate...
运行 exit 退出该bash
... 有关如何在 Linux 上的当前 shell 中执行脚本的更多详细信息?:
总结:
将该行添加
#!/bin/bash
为脚本的第一行输入命令
source shell_script.sh
或. shell_script.sh
注意:.
在 bash 中相当于source
在 bash 中。
解决方案 12:
这个答案与@Lamma 的答案类似。这对我有用 ->
(1)我定义了几个变量;conda activate 函数、环境目录和环境
conda_activate=~/anaconda3/bin/activate
conda_envs_dir=~/anaconda3/envs
conda_env=<env name>
(2)我利用conda activate
环境
source ${conda_activate} ${conda_envs_dir}/${conda_env}
(3)然后你就可以运行你的python脚本了
python <path to script.py>
这绕过了conda init
要求。我的.bashrc
已经初始化并且获取.bashrc
文件对我来说不起作用。@Lamma 的答案对我有用,上面的代码也是如此。
解决方案 13:
#open terminal or CMD as administrator
$ cd <path Anaconda3 install>Scripts
$ activate
$ cd ..
$ conda activate scratch