激活snakemake中的现有conda环境

时间:2019-11-29 15:20:33

标签: python conda snakemake

我如何获取snakemake来激活环境列表中已经存在的conda环境?

我知道您可以将--use-conda与.yaml环境文件一起使用,但这似乎会生成一个新环境,当环境已经存在时,这只会令人讨厌。任何对此的帮助将是无价之宝。

我尝试使用:

conda:
    path/to/some/yamlFile

但是它只是返回命令,找不到环境中软件包的错误

3 个答案:

答案 0 :(得分:1)

这不可能,我认为这主要是一件好事。唯一拥有env所有权的Snakemake通过要求更新YAML而不是使用conda (install|update|remove)直接操纵env来帮助提高可重复性。请注意,这种更新和重新创建YAML的做法是a Conda best practice when mixing in Pip,并且一般采用它肯定不会受到损害。

Conda进行了大量的硬链接,所以我不会过多地重复-it's mostly superficial


如果空间确实是紧缺的资源,则可以根本不使用Snakemake的--use-conda标志,而是将激活的命名环境作为您提供的shell命令或脚本的一部分。我将非常小心,不要操纵这些环境,或者至少要非常努力地追踪对它们所做的更改。也许,是在版本控制下跟踪conda env export > env.yaml的输出,并将该YAML作为输入文件放入激活环境的Snakemake规则中。

答案 1 :(得分:1)

有可能。这本质上是一个环境配置问题。您需要在蛇形规则中调用 bash 并在那里加载 conda-init 的 bash 配置文件。下面的例子适用于我:

rule test_conda:
    shell:
        """
        bash -c '
            . $HOME/.bashrc # if not loaded automatically
            conda activate base
            conda deactivate'
        """

此外,在这种情况下根本不需要 --use-conda

答案 2 :(得分:0)

跟进liagy的回答,由于snakemake以严格的bash模式(set -u标志)运行,conda activate或deactivate可能会抛出一个错误,显示与conda环境相关的未绑定变量。我最终编辑了包含激活功能的父 conda.sh 文件。这样做会在激活或停用 conda 环境时暂时禁用 u 标志,但会保留 bash 严格模式以用于蛇形制作工作流程的其余部分。

这是我所做的:

编辑(备份原始文件后)~/anaconda3/etc/profile.d/conda.sh并从__conda_activate()中的第一行添加以下内容块:

__conda_activate() {
    if [[ "$-" =~ .*u.* ]]; then
        local bash_set_u
        bash_set_u="on"
        ## temporarily disable u flag
        ## allow unbound variables from conda env
        ## during activate/deactivate commands in
        ## subshell else script will fail with set -u flag
        ## https://github.com/conda/conda/issues/8186#issuecomment-532874667    
        set +u
    else
        local bash_set_u
        bash_set_u="off"
    fi

# ... rest of code from the original script

并且还在 __conda_activate() 块的末尾添加以下代码以仅在运行 conda 激活/停用功能之前存在时重新启用 bash 严格模式。

    ## reenable set -u if it was enabled prior to
    ## conda activate/deactivate operation
    if [[ "${bash_set_u}" == "on" ]]; then
        set -u
    fi
}

然后在 Snakefile 中,您可以使用以下 shell 命令来管理现有的 conda 环境。

    shell:"""
        ## check current set flags
        echo "$-"
        ## switch conda env
        source ~/anaconda3/etc/profile.d/conda.sh && conda activate r-reticulate
        ## Confirm that set flags are same as prior to conda activate command
        echo "$-"

        ## switch conda env again
        conda activate dev
        echo "$-"
        which R
        samtools --version

        ## revert to previous: r-reticulate
        conda deactivate
        """

您不需要为 __conda_deactivate 函数添加上述补丁,因为它是激活脚本的源代码。

PS:编辑~/anaconda3/etc/profile.d/conda.sh 并不理想。始终备份原始和编辑过的文件。更新 conda 很可能会覆盖这些更改。