当前位置: 首页 > 面试题库 >

Python-通过Shell脚本激活conda env

贺文彬
2023-03-14
问题内容

我希望运行一个简单的Shell脚本来简化某些conda环境的管理。condaactivatelinuxos中通过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'.

问题答案:

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

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

编辑:更多研究告诉我,condainit错误消息中提到的功能实际上是v4.6.0的新功能,该功能允许快速设置环境,以便您可以使用它condaactivate来代替旧的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

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



 类似资料:
  • 问题内容: 我想从Python脚本激活实例。 我知道这很容易做到,但是我看过的所有示例都使用它在env中运行命令,然后关闭子进程。 我只是想激活并返回外壳,就像一样。 像这样: 这可能吗? 问题答案: 如果要在下运行Python子进程,可以通过使用位于的目录中的Python解释器运行脚本来实现: 但是,如果要在当前的Python解释器下而不是子进程下激活,则可以使用以下脚本:

  • 问题内容: 是否有任何聪明的方法可以通过ssh在远程主机上运行本地Bash功能? 例如: 是的,我知道这行不通,但是有办法实现吗? 问题答案: 您可以使用该命令通过来使功能在远程计算机上可用。有多个选项,具体取决于您要如何运行远程脚本。 要在远程主机上使用该功能: 更好的是,为什么还要麻烦管道: 或者,您可以使用HEREDOC: 如果要发送脚本中定义的所有函数,而不仅仅是发送,请像这样使用: 说明

  • 我有一个配置单元Udf,在配置单元终端工作良好,我想我想通过shell脚本执行它。在配置单元终端上,我可以执行以下命令: 然后我得到返回代码1 配置单元Udf是否支持shell脚本,如果它做错了我正在做什么。提前致谢

  • 我在Hue中使用oozie编辑器调用一个bash shell脚本。 我使用了工作流中的shell操作,并在shell命令中的不同选项下面进行了尝试: null 无法运行程序“sec_test_oozie.sh”(在目录“/data/hadoop/yarn/local/usercache/user/appcache/application_1399542362142_0086/container_1

  • 我需要在google workspace上自动化一些流程,现在我只能通过API激活Gmail,我在任何地方都找不到任何资源或示例。 感谢您的帮助,指出参考或答案。 更新: 所以我有谷歌工作区,我正在研究自动用户和他们的gmail帐户。从屏幕截图中,我可以简单地点击“激活Gmail”,它会检查我的MX记录并激活它,但我正在寻找一个解决方案,在那里我可以使用Ruby通过谷歌API来实现。

  • 问题内容: 我尝试谷歌搜索答案,但没有运气。 我需要使用我的超级计算机服务器,但是要运行我的python脚本,必须通过shell脚本执行。 例如我要执行 如何做到这一点? 问题答案: 只需确保python可执行文件在PATH环境变量中,然后在脚本中添加 细节: 在文件job.sh中,放入 执行此命令以使脚本可运行: 运行 :