【问题标题】:Snakemake: I keep getting The 'conda' command is not available in $PATH. when running on SGE clusterSnakemake:我不断收到 $PATH 中没有“conda”命令。在 SGE 集群上运行时
【发布时间】:2018-04-05 20:09:31
【问题描述】:

我在这里扯头发,希望有人可以帮助我。

运行snakemake 4.8.0

我有一个 snakemake 管道,我使用两个 conda envs 和 --use-conda 运行它,它在作为独立管道运行时运行良好。

但是,当我在我们的集群上运行时,我得到了错误:

“'conda' 命令在 $PATH 中不可用。”

现在。 Anaconda 安装在我们的集群上,但我们需要在节点上激活它:

module load anaconda

另外,模块被定义为一个函数,所以我首先有一些东西。因此,在我的蛇文件的顶部,我有:

shell.prefix("source $HOME/.bashrc; source /etc/profile; module load anaconda; )

这并不能解决问题。

我什至在我的.bashrc 中输入了module load anaconda,但这仍然不起作用。仅在集群执行时,我收到关于 conda 未找到的错误。

对我的.bashrc 的其他更改被snakemake 拾取并被拾取,所以我不知道为什么 conda 会出现问题。

我什至创建了一个 conda 环境,将 snakemake 和 conda 加载到该环境中,在提交脚本和 Snakefile 中激活环境:

shell.prefix("source $HOME/.bashrc; source /etc/profile; module load anaconda; source activate MAGpy-3.5; ")

仍然说“$PATH 中没有'conda' 命令。”

真的把我的头发扯掉了。

顺便说一句,我使用qsub -S /bin/bash 提交,也使用shell.executable("/bin/bash"),但在.snakemake 中创建的临时shell 脚本由/bin/sh 运行 - 这是预期的吗?

请帮帮我!

【问题讨论】:

  • 对不起,上面的错误信息来自一个旧版本的snakemake,我在4.8.0得到的是“subprocess.CalledProcessError: Command 'which conda' returned non-zero exit status 1”跨度>
  • snakemake 命令是否在您qsub 的脚本中运行?该错误似乎来自创建(而不是激活)conda 环境的进程,而这又似乎是由snakemake 本身运行的,而不是由snakemake 产生的作业。
  • 是的,这个工作很好,因为在那个工作中我“模块加载 anaconda”,然后“源激活 env”,然后运行 ​​snakemake。该作业完美地在 Snakefile 中创建了两个 conda env(我正在使用 --use-conda),但随后我的初始作业提交的作业因 subprocess.CalledProcessError: Command 'which conda' returned non-zero exit status 1 问题而失败,这意味着它是找不到 conda 的辅助作业,而主要作业可以
  • 你能在 ~/.profile 或 ~/.bashrc 中加入一些东西来验证它实际上被调用了吗? 'touch ~/bash_brickwall.txt'之类的东西

标签: conda snakemake environment-modules


【解决方案1】:

我总是要使用:

set +u; {params.env}; set -u

{params.env} 正在从我的 config.yaml 加载 conda 命令)

在 Snakefile 的 shell 命令中调用 conda 环境时,因为 Snakemake 会自动在 shell 命令前添加 set +u

不确定这是否能解决您的问题,但值得一试吗?

【讨论】:

  • 请注意,Snakemake 可以为您进行 env 激活:snakemake.readthedocs.io/en/stable/snakefiles/…
  • 感谢 Johannes,我正在使用 --use-conda,但似乎在我们的节点上,snakemake 找不到 conda,这就是它崩溃的原因
  • 备案:在我们基于 SLURM 的集群上,我必须使用 . /PATH/TO/miniconda3/etc/profile.d/conda.sh; set +u; conda activate ./LOCAL_ENV; set -u; BINARY_IN_LOCAL_ENV,否则我会收到错误,表明我的 conda 环境设置不正确。
【解决方案2】:

您可以提供自定义的“作业脚本模板”,您尝试过吗?默认是这样的:

#!/bin/sh
# properties = {properties}
{exec_job}

所以也许你的可能看起来像这样:

#!/bin/bash
# properties = {properties}
module add anaconda
{exec_job}

然后你在运行snakemake时使用--jobscript参数引用这个文件。

附:如果您查看代码,{exec_job} 会被填充为对 python -m snakemake 的调用,而没有任何 PATH 设置,我认为这会导致您看到的错误。

【讨论】:

    【解决方案3】:

    module 所做的一般只不过是修改 PATH 和其他环境变量。这也适用于 conda 环境和source activate

    例如,在我们的集群上,QIIME2 安装在 conda 环境中,但是它的模块文件是

    prepend-path    PATH            /opt/sw/qiime/2.2018.2/bin
    prepend-path    PYTHONPATH      /opt/sw/qiime/2.2018.2/lib/python3.5/site-packages
    

    而我们的conda 模块文件是

    prepend-path    PATH            /opt/sw/conda/3/bin
    

    所以假设 MAGpy-3.5 是你的 conda 环境,你可以

    (a) 为您的 MAGpy 管道创建一个模块并加载它,忽略它是一个 conda 环境或

    (b) 使用修改后的 PATH 使 snakemake 运行(我不知道 snakemake 是如何处理环境变量的)

    (c) 在 .bashrc 中添加 conda 安装或 MAGpy 安装的路径

    (b) 和 (c) 都违背了拥有模块系统 IMO 的目的,但我发现 anaconda 本身与modulefiles 相比有点冗余。在我们的集群中,当我们使用 anaconda 安装一些软件时,我们从不让用户使用source activate 加载它们,而是为它们写modulefiles

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,并通过将我的提交文件中的路径导出到(隐藏的)conda 目录来解决它,该目录通常位于您的主目录中。例如

      export PATH=/home/yourusername:$PATH
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多