当规则上出现
MissingInputException
时,我们会收到该规则的输出文件列表、通配符以及预期作为规则输入的“受影响的文件”。
调试时找不到受影响文件的主要原因有两个:
第一种情况很容易调试,而第二种情况则比较棘手。 有没有办法查看文件名依赖关系的“堆栈跟踪”,这些文件名依赖关系会产生导致
MissingInputException
的通配符?
想象一下,我们不明白规则匹配在 Snakemake 中是如何工作的,并且我们编写以下代码试图从名为
this_is_an_input_file-summary.txt
this_is.tsv
的 tsv 文件生成 an_input_file.tsv
:
rule all:
input: 'this_is_an_input_file-summary.txt'
rule A:
input: '{prefix}.tsv'
output: '{prefix}-summary.txt'
rule B:
input: '{part1}.tsv', '{part2}.tsv'
output: '{part1}_{part2}.tsv'
这当然不会按预期工作,因为规则
B
将递归匹配并期望文件 this.tsv
、is.tsv
、an.tsv
、input.tsv
和 file.tsv
。
该错误将在规则 B
中显示为 MissingInputException
,我们可以轻松调试这种情况,因为工作流程非常紧凑。
现在想象一下,这些规则被埋藏在数百个其他规则中,所有规则有数千个输入文件,并且有一个更复杂的 DAG 通向规则
B
。
MissingInputException
意味着我们无法生成 DAG。
有没有办法从规则
all
的输入文件开始打印出导致此异常的文件和规则的顺序?
@TroyComi 已经有了答案,但为了其他人查看这个问题(这是 Snakemake 中的常见问题)的利益,这里是在问题中给出的示例工作流程上运行
--debug-dag
的输出:
$ snakemake --debug-dag -n
Building DAG of jobs...
candidate job all
wildcards:
candidate job A
wildcards: prefix=this_is_an_input_file
candidate job B
wildcards: part1=this_is_an_input, part2=file
candidate job B
wildcards: part1=this_is_an, part2=input
candidate job B
wildcards: part1=this_is, part2=an
candidate job B
wildcards: part1=this, part2=is
MissingInputException in rule B in file /home/tbooth2/workspace/snakemake_scratch/stack_overflow/debug_dag/Snakefile, line 8:
Missing input files for rule B:
output: this_is.tsv
wildcards: part1=this, part2=is
affected files:
this.tsv
is.tsv
我同意堆栈跟踪将是一个很大的增强。