Python-通过Shell脚本激活conda env

我希望运行一个简单的Shell脚本来简化某些conda环境的管理.通过Linux操作系统中的conda激活来激活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'.
最佳答案
该错误消息很有帮助-告诉您在运行脚本的子外壳中未正确设置conda.要在脚本中使用conda,您将需要(如错误消息所述)运行conda init bash(或任何您的shell是). conda的行为及其设置方式取决于您的conda版本,但版本4.4行为的原因是conda依赖于通常由conda shell本身设置的某些环境变量.最重要的是,this changelog entry解释了为什么您的conda激活和停用命令不再像4.4和更高版本中所期望的那样起作用.

有关此内容的更多讨论,请参见GitHub上的official conda issue.

编辑:更多研究告诉我,错误消息中提到的conda init函数实际上是v4.6.0的新功能,它允许快速设置环境,以便您可以使用conda激活而不是旧的源激活.但是,这样做的原因是它添加/更改了当前shell的几个环境变量,并且还更改了RC文件(例如:.bashrc),并且RC文件的更改从未在当前shell中被获取-仅在新创建的壳. (除非您当然再次提供.bashrc).实际上,conda init –help可以这么说:

IMPORTANT: After running conda init,most shells will need to be closed and restarted for changes to take effect

但是,您显然已经在运行conda init,因为您可以交互使用conda激活.实际上,如果打开.bashrc,则应该可以看到conda教您的shell在哪里寻找conda命令,从而增加了几行内容.但是,脚本的问题在于,.bashrc不是由运行shell脚本的子shell来提供的(有关更多信息,请参见this answer).这意味着,即使您非登录交互式shell看到conda命令,您的非交互式脚本子shell也不会-不管您调用conda init多少次.

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

bash -i shell_script.sh

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

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...