conda - 如何追溯用于在snakemake工作流程中生成结果文件的确切软件版本
问题描述
假设我正在遵循为snakemake建议的最佳实践工作流程。现在我想知道一个给定的文件是如何(即哪个版本)plots/myplot.pdf
生成的。我发现这非常困难,如果不是不可能的话,只有手头有结果文件夹。
更详细地说,假设我是使用生成的结果。snakemake --use-conda --conda-prefix ~/.conda/myenvs
它将解析并下载以下规则中指定的 conda-environments(从文档中复制):
rule NAME:
input:
"table.txt"
output:
"plots/myplot.pdf"
conda:
"envs/ggplot.yaml"
script:
"scripts/plot-stuff.R"
说的内容envs/ggplot.yaml
如下:
channels:
- conda-forge
dependencies:
- r-ggplot2
完成后,ggplot 环境将保存在 say 下(注意,snakemake 自动分配的环境名称 d2d1d57b):~/.conda/myevns/d2d1d57b
问题是,如果我将workflow
子文件夹作为结果发送给其他人(或作为论文的补充),我不知道ggplot
该运行使用了哪个版本。我所知道的是yaml文件的内容(使用时也会报告--reports
。)。此外,由于 ggplot 依赖于其他软件,例如R
,我不知道使用此环境的给定规则使用了哪个 R 版本,因为 yaml 文件没有列出间接依赖项。
理想情况下,我希望将完整的环境软件版本与工作流结果一起提供。作为一种解决方法,可以使用conda env export name_of_env
并复制结果文件夹中的输出,但奇怪的conda list -n ~/.conda/myevns/d2d1d57b
是不起作用(由于错误Characters not allowed: ('/', ' ', ':', '#')
)
手动创建环境并检查确实给了我(以及其他信息):
r-base 4.0.2 he766273_1 conda-forge
r-ggplot2 3.3.2 r40h6115d3f_0 conda-forge
这正是我所追求的,但这当然手动操作太乏味了。
据我所知,在使用包装器时也是如此。
总而言之,给定工作流程甚至工作流程中的给定文件,如何追溯用于生成它的确切软件版本。理想情况下,默认情况下,此信息将与工作流的结果一起自动提供。
也许我什至错过了一些非常明显的东西,所以希望有人能对此有所了解。
解决方案
根据我们在评论中的讨论,您可以将您的环境重定向到日志文件:
rule NAME:
input:
"table.txt"
output:
"plots/myplot.pdf"
log:
"mylog.txt"
conda:
"envs/ggplot.yaml"
shell:
"""
conda env export > {log}
yourcode
"""
但是,正如您所指出的,如果人们不使用 --use-conda,这将不起作用,而且将其添加到每个规则中很乏味,因此您可以尝试这样的事情(未经测试,可能不起作用):
if workflow.use_conda:
shell.prefix("set -o pipefail; conda env export > {log}; ")
这将导出添加到每个 shell 命令!
现在,如果您使用脚本,我不再那么确定如何继续。“最简单”可能只是在 python/R 中的 shell 命令中调用“conda env export”
编辑
shell 前缀技巧似乎不起作用,所以我删除了文本。
推荐阅读
- node.js - zuora 搜索产品的 API
- apache-flink - 如何在 flink 1.7.0 中只启动一个任务管理器,如果它以某种方式被杀死?
- swift - iOS 13 自定义字体下载和安装
- spring-boot - 如何简化 keycloak REST API 服务
- ios - 如何从 MKClusterAnnotation 获取具有相同坐标的注释?
- javascript - 如何防止odoo 10中的异步执行?
- oracle - 如何使用两个顶点版本运行 weblogic?
- c# - 我可以在构造函数中创建一个本地函数并调用它吗
- mongodb - 外包网页内容与维护本地内容
- c# - 部署 wensite 时的 HTTP 500