MissingInputException [Snakemake] 之后是否有可用的“堆栈跟踪”

问题描述 投票:0回答:1

问题

当规则上出现

MissingInputException
时,我们会收到该规则的输出文件列表、通配符以及预期作为规则输入的“受影响的文件”。

调试时找不到受影响文件的主要原因有两个:

  1. “受影响的文件”列表是正确的,但缺少或格式错误的规则来匹配这些文件,或者文件系统中缺少文件,或者
  2. 通配符是意外的,并创建一个包含错误文件名的“受影响的文件”列表。

第一种情况很容易调试,而第二种情况则比较棘手。 有没有办法查看文件名依赖关系的“堆栈跟踪”,这些文件名依赖关系会产生导致

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
的输入文件开始打印出导致此异常的文件和规则的顺序?

snakemake
1个回答
0
投票

@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

我同意堆栈跟踪将是一个很大的增强。

© www.soinside.com 2019 - 2024. All rights reserved.