假设我正在遵循蛇形建议的最佳实践工作流程。现在,我想知道给定文件的plots/myplot.pdf
生成方式(即哪个版本)。我发现只有手头有结果文件夹,这很难甚至很难做到。
更详细地说,说我是使用生成结果的。snakemake --use-conda --conda-prefix ~/.conda/myenvs
它将解析并下载以下规则中指定的conda环境(从文档中复制):
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环境将被保存为例如(注意,snakemake自动分配的环境名称d2d1d57b):〜/ .conda / myevns / d2d1d57b
问题是,如果我将workflow
子文件夹作为结果发送给其他人(或作为论文的补充),则不知道ggplot
该运行使用了哪个版本。我只知道yaml文件的内容(使用--reports
。时也会报告该文件)。另外,由于ggplot依赖于其他软件,例如R
,我不知道使用该环境的给定规则使用了哪个R版本,因为yaml文件未列出间接依赖关系。
理想情况下,我想随工作流结果一起提供完整的环境软件版本。作为一种解决方法,可以使用conda env export name_of_env
输出并将其复制到result文件夹中,但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前缀技巧似乎无效,因此我删除了全文。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句