如果我在子文件夹中指定目标,则找不到Snakemake子工作流程结果

时间:2019-04-27 05:36:36

标签: snakemake

让我们考虑两个蛇文件,一个主文件和一个子工作流:

./ Snakefile:

subworkflow sub:
    workdir: "."
    snakemake: "subworkflow/Snakefile"

rule all:
    input: sub("subresult")

./ subworkflow / Snakefile:

rule sub_all:
    output: "subresult"
    shell: "touch {output}"

此代码效果很好。现在让我们进行一个小的更改:在主文件中用“ ./subresult”替换“ subresult”: output: "./subresult" 仍然有效,但是如果我在子工作流程中进行了相同的更改,则会出现异常:

MissingRuleException:
No rule to produce subresult

如果我在子工作流规则的输出中指定任何其他子文件夹,则会引发相同的异常:

subworkflow sub:
    workdir: "."
    snakemake: "subworkflow/Snakefile"

rule all:
    input: sub("ANY_PATH/subresult")
rule sub_all:
    output: "ANY_PATH/subresult"
    shell: "touch {output}"

我猜这不是正常现象。我的代码有什么问题吗?有没有办法在子文件夹中指定子工作流程的目标?

操作系统:Windows + MinGW

Python 3.6.5

Snakemake 5.4.5、5.2

更新

我尝试了@JeeYem提供的示例,甚至 data 子目录在我的系统上也不起作用。经过一番调查,我发现这是Windows或Windows / MinGW组合的特定于平台的问题。下面是可以正常工作并显示问题的代码(我留下了原始代码的注释以供比较):

文件Snakefile:

subworkflow otherworkflow:
    workdir:
        "."
    snakefile:
        "kingmaker.Snakefile"

rule all:
    input:
        otherworkflow('data/a.txt')

子工作流程文件kingmaker.Snakefile:

rule write_file:
    output:
        #'data/a.txt'
        'data\\a.txt'
    shell:
        #'touch {output}'
        'touch data/a.txt'

请注意,我什至不能在shell部分中使用{output}变量。

我将向Snakemake存储库提交票证。

1 个答案:

答案 0 :(得分:0)

根据我的测试,我猜想您是在./或/和input中这些路径的开头使用了output,这是导致问题的原因。我不确定确切的原因,但是snakemake似乎指出了问题的原因(请参见答案的结尾)。

在如下所示的示例脚本中,我可以使用子目录data,而在两个Snakefile中都没有任何问题。但是,如果我使用./data(即子目录开头的./),snakemake将无法正常工作。

文件Snakefile

subworkflow otherworkflow:
    workdir:
        "."
    snakefile:
        "kingmaker.Snakefile"

rule all:
    input:
        otherworkflow('data/a.txt')

子工作流程文件kingmaker.Snakefile

rule write_file:
    output:
        'data/a.txt'
    shell:
        'touch {output}'

实际上,如果您在输出路径的开头使用snakemake -s kingmaker.Snakefile本身(即./)运行子工作流,snakemake强烈建议不要使用此警告:

Relative file path './data/a.txt' starts with './'. 
This is redundant and strongly discouraged. 
It can also lead to inconsistent results of the file-matching approach used by Snakemake. 
You can simply omit the './' for relative file paths.

我在Mac上使用snakemake v5.4.0