让我们考虑两个蛇文件,一个主文件和一个子工作流:
./ 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存储库提交票证。
答案 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
。