【问题标题】:Conda command working in command prompt but not in bash scriptConda 命令在命令提示符下工作,但不在 bash 脚本中
【发布时间】:2019-03-17 15:43:09
【问题描述】:

我的 anaconda (4.5.4) 只要我通过 linux 终端 (bash shell) 使用它就可以正常工作。但是,在 bash 脚本中运行 conda 命令根本不起作用。

脚本 test.sh 包含以下几行:

#!/bin/bash
conda --version
conda activate env

现在,运行 bash test.sh 会导致错误 test.sh: line 2: conda: command not found test.sh: line 3: conda: command not found

根据 anaconda 版本 > 4.4 的建议,我的 .bashrc 不包含

export PATH="/opt/anaconda/bin:$PATH",

但是

. /opt/anaconda/etc/profile.d/conda.sh

谢谢。

【问题讨论】:

标签: python linux bash anaconda conda


【解决方案1】:

假设您尝试使用 "miky" @ "server" 地址访问用户名。首先当您登录到您的用户时;用 "which conda" 学习 conda 路径,那么你可能会得到一个路径,例如 "/home/miky/anaconda3/bin/conda" 然后将您的 conda 命令如下(在我的示例中,我使用 conda 来安装 mysql 插件。): shh miky@server -t "/home/miky/anaconda3/bin/conda install -y -c anaconda mysql -connector-python" 仅此而已。

【讨论】:

  • which 在 bash 中看不到函数、别名或 shell 内置命令,因为它是外部命令而不是内置 shell。请改用type conda
【解决方案2】:

如果@randomwalker 的方法对您不起作用(无论何时您的脚本在更基本的 shell(例如 sh)中运行时都不起作用),那么您有两个选择。

  1. 将此添加到您的脚本中:eval $(conda shell.bash hook)

  2. 使用:bash -i <scriptname> 调用您的脚本,以便它在您的交互式环境中运行。

【讨论】:

  • "... 任何时候你的脚本都不会在更基本的 shell 中运行,例如 sh" - baller!完美的答案,顺便说一句。效果很好。
  • 如果您没有明确引用结果传递给eval 的扩展,则可能会出现细微的错误。因此,它应该更像eval "$(conda shell.bash hook)",因此在eval 获取其参数列表之前,不会将任何glob 表达式替换为匹配的文件名。 (这不是没有引用可能影响此用例的唯一副作用,但它是在评论范围内最容易解释的副作用)。
【解决方案3】:

感谢@darthbith 的评论,我解决了这个问题。

由于conda是一个bash函数,bash函数不能传播到独立的shell(例如通过执行bash脚本打开),所以必须添加一行

source /opt/anaconda/etc/profile.d/conda.sh

在调用 conda 命令之前到 bash 脚本。否则 bash 将不知道 conda。

【讨论】:

  • 这很棒!谢谢。我在/home/ubuntu/miniconda3/etc/profile.d/conda.shonda.sh
  • 有没有办法传播这个?我的 bash 脚本运行其他也想使用 conda 的 bash 脚本,我是否需要在每个脚本中都包含该调用?
  • 在这个 github 问题中:github.com/conda/conda/issues/7980。默认情况下,函数不会导出以在子 shell 中可用。我建议你这样做: source ~/anaconda3/etc/profile.d/conda.sh conda activate my_env
【解决方案4】:

执行sudo ln -s /home/<user>/miniconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh 并重试。这应该为所有用户永久激活 conda

source

【讨论】:

  • 谢谢,但我不是我正在处理的远程服务器的管理员。 conda 在终端中可以正常工作,但不能在 bash 脚本中。通过. /opt/anaconda/etc/profile.d/conda.sh 我已经为自己激活了 conda。
  • 只是conda: command not found 表明它没有被激活。可能 conda.sh 没有做它的工作。啊和他们之间应该没有空格 /opt/... 和开头的那个点。
  • 只有由父进程作为登录 shell 的进程启动的脚本才会看到由profile.d.bash_profile 等设置的环境变量。并非所有脚本都属于此类别。跨度>
猜你喜欢
  • 2016-05-19
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2017-08-08
  • 2018-07-10
  • 2015-11-28
相关资源
最近更新 更多