python - Snakemake - 如何设置 conda 环境路径
问题描述
在 Snakemake 中,可以通过定义规则来轻松设置 conda 环境conda: "envs/my_environment.yaml"
。这样,YAML 文件指定在运行管道之前要安装哪些包。
某些软件需要第三方软件的路径才能执行特定命令。
这方面的一个示例是使用 RSEM 生成参考索引时(来自 GitHub 页面DeweyLab - RSEM的示例):
rsem-prepare-reference --gtf mm9.gtf \
--star \
--star-path /sw/STAR \
-p 8 \
--prep-pRSEM \
--bowtie-path /sw/bowtie \
--mappability-bigwig-file /data/mm9.bigWig \
/data/mm9 \
/ref/mouse_0
我可以找到或预定义通过 conda 在先前规则中安装的 aligner 软件的目录(例如[workdir]/.snakemake/conda/STAR
)吗?STAR
目前,一个选项可能是使用命令行界面选项创建一个共享环境文件夹:--conda-prefix
Snakemake docs - 命令行界面,但是由于这是一个单一案例问题,我更愿意在规则中定义此信息.
解决方案
我有两种方法来处理这个问题。
1:让 Conda 处理 PATH
仅当 STAR 不在 PATH 上时,--star-path
才需要指定该特定选项 ( ) 。但是,如果此规则的 YAML 中包含 STAR,则 Conda 会将其放在 PATH 作为环境激活的一部分,因此不需要该选项。也一样。因此,对于这样的规则,YAML 可能类似于:--bowtie-path
name: rsem
channels:
- conda-forge
- bioconda
- defaults
dependencies:
- rsem
- star
- bowtie
根据这个线程,考虑将包上的版本修复为次要版本(例如,bowtie=1.3
)。
2:config.yaml
用于管道选项
如果由于某种原因您不想要一个完全独立的管道,例如,您的系统已经预装了许多标准基因组学软件,如 STAR,那么您可以config.yaml
在用户应根据他们的系统调整管道的地方添加一个条目。例如,以下是相关部分:
配置.yaml
star_path: /sw/STAR
bowtie_path: /sw/bowtie
蛇文件
configfile: config.yaml
## this is not a complete rule
rule rsem_prep_ref:
# needs input, output...
params:
star=config['star_path'],
bowtie=config['bowtie_path']
threads: 8
conda: "envs/myenv.yaml"
shell:
"""
rsem-prepare-reference --gtf mm9.gtf \
--star \
--star-path {params.star} \
-p {threads} \
--prep-pRSEM \
--bowtie-path {params.bowtie} \
--mappability-bigwig-file /data/mm9.bigWig \
/data/mm9 \
/ref/mouse_0
"""
实际上,您的管道假设已经存在并且不是由管道本身生成的任何内容都应该进入您的config.yaml
(例如,mm9.gtf
或mm9.bigWig
)。
共享环境注意事项
一般来说,我建议不要尝试共享环境。但是,您仍然可以通过在用户之间共享包缓存并确保在同一文件系统上创建环境来节省空间(这使 Conda 可以使用硬链接而不是复制)。您可以使用 Conda 配置选项pkgs_dirs
来设置包缓存位置。如果管道本身已经与 Conda 包缓存在同一个文件系统上,我会让 Snakemake 使用默认位置 ( .snakemake/conda
) 而不会弄乱--conda-prefix
参数。
否则,您可以给 Snakemake--conda-prefix
参数以指向同一文件系统上的目录,在该目录中创建 Conda 环境。这应该是一个相当通用的目录,管道的所有环境都位于其中。OP ( [workdir]/.snakemake/conda/STAR
) 中提出的内容没有意义。
推荐阅读
- java - 通过 JNI 线程安全地使用 GraphViz 库
- modelica - 将字符串数组作为输入传递给外部 C 函数
- php - 在 laravel 中使用 ajax 将数据保存到数据库而不重新加载
- python - 我不能在我的 Mule ESB 应用程序中使用 Pandas、Numpy、BeautifulSoup 和 PyMongo 的外部 Python 库
- java - 抓取所有数据值形成一个 web 表
- node.js - 如何在 AWS Lambda 中获取文件路径?
- python - 我如何在熊猫中分隔两个数字
- aws-lambda - 使用石墨烯模块使 lambda 中的部署函数出错
- pine-script - 如果下一根蜡烛对我们的移动超过止损距离,则止损不会正确触发
- r - 有没有办法知道 R 在随机森林模型上走了多远?