我如何获取snakemake来激活环境列表中已经存在的conda环境?
我知道您可以将--use-conda与.yaml环境文件一起使用,但这似乎会生成一个新环境,当环境已经存在时,这只会令人讨厌。任何对此的帮助将是无价之宝。
我尝试使用:
conda:
path/to/some/yamlFile
但是它只是返回命令,找不到环境中软件包的错误
答案 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 很可能会覆盖这些更改。