Python-通过Shell脚本激活conda env

use*_*332 9 python python-3.x conda

我希望运行一个简单的Shell脚本来简化某些conda环境的管理。conda activatelinuxos中通过os 激活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'.
Run Code Online (Sandbox Code Playgroud)

Sim*_*mba 20

为快速解决方案bash在前面加上下面的init脚本到您的bash脚本。

eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"
Run Code Online (Sandbox Code Playgroud)

完毕。


对于其他 shell,请检查您的 shell 的 init conf,将以下内容复制到 shell conf 中并将其添加到您的脚本中。

# >>> conda initialize >>>
...
# <<< conda initialize <<<
Run Code Online (Sandbox Code Playgroud)

你也可以使用

conda init --all --dry-run --verbose
Run Code Online (Sandbox Code Playgroud)

获取脚本中所需的初始化脚本。

解释

这是通过引进相关conda initconda4.6。

引用 conda 4.6 发布日志

Conda 4.4 允许“conda activate envname”。问题是设置 shell 以使用这个新功能并不总是那么简单。Conda 4.6 添加了广泛的初始化支持,以便比以往更多的 shell 可以使用新的“conda activate”命令。有关更多信息,请阅读“conda init –help”的输出

conda initconda4.6中引入之后,conda 仅将命令公开 condaPATH“base”中的所有二进制文件中,而不是所有二进制文件中。环境开关由统一conda activate env-nameconda deactivate在所有平台上。

但是要使这些新命令起作用,您必须使用conda init.

问题是你的脚本文件是在一个子 shell 中运行的,并且conda没有在这个子 shell 中初始化。

参考

  • 您能解释一下将“command”放在“conda”之前的目的吗?是否有某些特殊情况会导致“conda”的 shell 函数出现问题? (7认同)

Lam*_*mma 14

在 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
Run Code Online (Sandbox Code Playgroud)

这是对我有用的解决方案,如果共享脚本也适用。这也解决了必须使用的问题,conda init因为在我使用过的某些集群上,系统已初始化,但conda activate仍无法在 shell 脚本中工作。

  • +1。正如[GitHub问题](https://github.com/conda/conda/issues/7980#issuecomment-441358406)中提到的 (2认同)

小智 8

如果你想使用shell脚本来运行另一个conda环境中的另一个python文件,只需通过以下命令运行另一个文件即可。

os.system('conda run -n <env_name> python <path_to_other_script>')
Run Code Online (Sandbox Code Playgroud)


小智 8

来自Github的这个答案对我有用(我使用的是 Ubuntu,所以它不仅仅适用于 Windows):

eval "$(conda shell.bash hook)"
conda activate my_env
Run Code Online (Sandbox Code Playgroud)


Nia*_*sky 6

该错误消息很有帮助-告诉您在运行脚本的子外壳中未正确设置conda。要在脚本中使用conda,您将需要(如错误消息所述)运行conda init bash(或您的外壳是什么)首先。conda的行为及其设置方式取决于您的conda版本,但4.4+版本行为的原因conda是取决于通常由conda shell本身设置的某些环境变量。最重要的是,此变更日志条目解释了为什么您的conda activatedeactivate命令在4.4及更高版本中不再表现出预期的行为。

有关此问题的更多讨论,请参见GitHub上的官方conda问题


编辑:更多研究告诉我,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 不是由运行shell脚本的子shell所提供的(有关更多信息,请参见此答案)。这意味着,即使您的非登录交互式shell看到了conda命令,您的非交互式脚本子shell也不会-不管您调用了多少次conda init

这就导致了一个猜想(我自己在Linux上没有conda,所以我无法对其进行测试),可以通过这样运行脚本来实现:

bash -i shell_script.sh
Run Code Online (Sandbox Code Playgroud)

您应该可以conda activate正常工作。为什么?-i是一个bash标志,告诉外壳程序您将开始以交互方式运行,这意味着它将自动获取您的.bashrc。这应该足以使您能够像正常使用一样在脚本中使用conda。

  • 感谢您的回复,但在查看了两个引用的链接后,我仍然不清楚如何解决该问题。我已经在我的 shell 脚本中尝试了 `conda init bash` 的组合以及采购 `. $CONDAHOME/etc/profile.d/conda.sh` 两者都不起作用。请注意,`conda info` 在 shell 脚本中工作正常。 (2认同)
  • 感谢您的附加信息。这似乎已经解决了问题。`$ cat shell_script.sh#!/ bin / bash,conda conda激活临时的conda info | grep“活动环境”`运行如下:`bash -i shell_script.sh`。并输出:`〜/ miniconda3 / bin / conda活动环境:从头开始` (2认同)
  • 我喜欢[这里](/sf/answers/3696977231/)的解决方案,因为它可以帮助运行bash文件,而不需要source或-i选项。 (2认同)

小智 6

我使用“源命令”运行shell脚本,它可以正常工作:

source shell_script.sh
Run Code Online (Sandbox Code Playgroud)

  • 请务必详细解释您的答案。Visti https://stackoverflow.com/help/how-to-answer 了解如何写出一个好的答案 (7认同)
  • @Prelude 当然,获取脚本并运行它是_不_相同的(有关更多信息,请参阅[此处](https://superuser.com/a/176788/684722))。基本上,采购将在当前 shell 中运行脚本中的行,而不是将它们封装在子 shell 中。有时,这就是人们想要的,但并非总是如此! (5认同)
  • 对我之前的评论的编辑,实际上最后它让我陷入了困境,我不得不删除我的整个linux并在使用它之后出现错误后重新安装它。因此,如果您打算使用它,请务必小心! (2认同)