Python-通过外壳脚本激活conda env

时间:2019-04-04 03:46:33

标签: python python-3.x conda

我希望运行一个简单的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'.

10 个答案:

答案 0 :(得分:5)

在Shell脚本中使用conda activatesource 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-nameconda deactivate统一。

但是要使这些新命令起作用,您必须使用conda init进行其他初始化。

问题是您的脚本文件在子外壳中运行,并且conda没有在该子外壳中初始化。

参考文献

答案 2 :(得分:1)

该错误消息非常有用-它告诉您在运行脚本的子外壳中未正确设置conda。要在脚本中使用conda,您需要(如错误消息所示)说)首先运行conda init bash(或任何您的shell)。 conda的行为及其设置方式取决于您的conda版本,但4.4+版本行为的原因是conda取决于通常由conda shell本身设置的某些环境变量。最重要的是,this changelog entry解释了为什么您的conda activatedeactivate命令在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