我希望运行一个简单的Shell脚本来简化某些conda环境的管理。在conda activate
操作系统中通过linux
激活conda环境在shell中工作正常,但在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'.
答案 0 :(得分:5)
在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脚本中工作。
答案 1 :(得分:2)
bash
的快速解决方案:在您的Bash脚本中将以下初始化脚本添加。
eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"
完成。
对于其他外壳,请检查外壳的init conf,将以下内容复制到shell conf中,然后将其添加到脚本中。
# >>> conda initialize >>>
...
# <<< conda initialize <<<
您也可以使用
conda init --all --dry-run --verbose
在脚本中获取所需的初始化脚本。
这与conda init
4.6中conda
的引入有关。
Quote from conda 4.6 release log
Conda 4.4允许“ conda激活envname”。问题在于设置外壳程序以使用此新功能并不总是很简单。 Conda 4.6添加了广泛的初始化支持,因此比以往更多的Shell可以使用新的“ conda activate”命令。有关更多信息,请阅读“ conda init –help”
的输出。
在conda init
4.6中引入conda
之后,conda仅公开命令
conda
放入PATH
,但不是“ base”中的所有二进制文件。在所有平台上,环境切换由conda activate env-name
和conda deactivate
统一。
但是要使这些新命令起作用,您必须使用conda init
进行其他初始化。
问题是您的脚本文件在子外壳中运行,并且conda
没有在该子外壳中初始化。
答案 2 :(得分:1)
该错误消息非常有用-它告诉您在运行脚本的子外壳中未正确设置conda。要在脚本中使用conda,您需要(如错误消息所示)说)首先运行conda init bash
(或任何您的shell)。 conda的行为及其设置方式取决于您的conda版本,但4.4+版本行为的原因是conda
取决于通常由conda shell本身设置的某些环境变量。最重要的是,this changelog entry解释了为什么您的conda activate
和deactivate
命令在4.4及更高版本中不再表现出预期的作用。
有关此的更多讨论,请参见GitHub上的official conda issue。
编辑:更多研究告诉我,错误消息中提到的conda init
函数实际上是v4.6.0的新功能,它允许快速设置环境,以便您可以使用conda activate
而不是旧的source activate
。但是,这样做的原因是它添加/更改了当前shell的多个环境变量,并且还更改了RC文件(例如:.bashrc
),并且RC文件的更改从未在当前shell中被获取。 -仅在新创建的外壳中。 (除非您当然再次提供.bashrc)。实际上,conda init --help
可以这么说:
重要提示:运行
conda init
后,大多数外壳程序都需要关闭并重新启动才能使更改生效
但是,您显然已经在运行conda init
,因为您 可以交互使用conda activate
。实际上,如果打开.bashrc,则应该可以看到conda教您的shell在哪里寻找conda命令,从而增加了几行内容。但是,脚本的问题在于,.bashrc是 not 而不是由运行shell脚本的子shell所提供的(有关更多信息,请参见this answer)。这意味着,即使您非登录交互式shell看到了conda命令,您的非交互式脚本子shell也不会-不管您调用conda init
多少次。
这导致一个猜想(我自己在Linux上没有conda,所以我无法对其进行测试)是通过这样运行脚本来实现的:
bash -i shell_script.sh
您应该看到conda activate
正常工作。为什么? -i
是一个bash标志,它告诉Shell您开始以交互方式运行,这意味着它将自动为您的.bashrc提供源。这应该足以使您能够像正常使用一样在脚本中使用conda。
答案 3 :(得分:1)
我只是遵循了类似 hong-xu
中的解决方案所以要运行一个 shell 命令来调用带有参数的脚本并使用特定的 conda 环境:
来自 jupyter 单元格,如下所示:
p1 = <some-value>
run = f"conda run -n {<env-name>} python {<script-name>.py} \
--parameter_1={p1}"
!{run}
答案 4 :(得分:0)
我使用'source command'运行shell脚本,它可以正常工作:
source shell_script.sh
答案 5 :(得分:0)
仅在shell中执行以下操作会带来什么问题:
源/opt/conda/etc/profile.d/conda.sh
(conda初始化仍被标记为“实验”,因此不确定使用它是否是个好主意)。
答案 6 :(得分:0)
当尝试从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环境有点不同。
答案 7 :(得分:0)
如果要使用shell脚本在另一个conda env中运行另一个python文件,只需通过以下命令运行另一个文件。
os.system('conda run -n <env_name> python <path_to_other_script>')
答案 8 :(得分:0)
这个答案类似于@Lamma 的答案。这对我有用 ->
(1) 我定义了几个变量; conda 激活函数,环境目录和环境
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 的回答和上面的代码一样对我有用。
答案 9 :(得分:-1)
#open terminal or CMD as administrator
$ cd <path Anaconda3 install>\Scripts
$ activate
$ cd ..
$ conda activate scratch