问题在于 shell 指令中的 {input} 与 {wildcards.namedVar} 访问。 See here in the documentation。话虽如此,我没有看到您的驱动程序要求 Snakemake 设置,我也建议这样做。 (我在下面的答案中添加了它)。它相当于 .PHONY 和所有规则模式(GNU Make 强迫我们进入的混乱约定)。
在您的 shell 指令中,变量 {filename} 可作为通配符对象的属性访问。您需要使用 python 点符号来访问它,例如 {wildcards.filename}。 话虽如此,更好的方法是直接访问输入通配符对象,因为它实际上已经内置了 toString 转换,因为它携带只有一个单个字符串列表(因为通配符对象可以包含多个个单独的通配符属性,所以行为是不可预测的)。
你可以忽略“.snk”后缀,我只是觉得它对 Snakemake 规则文件很好。在代码中,这就是我的意思:
test.snk
rule test:
output:
"{filename}"
wildcard_constraints:
filename = "[abc]"
shell:
"echo x > {wildcards.filename}"
以同样的方式,您也可以这样做,test.snk:
rule test:
output:
"{filename}"
wildcard_constraints:
filename = "[abc]"
shell:
"echo x > {output}"
推荐代码库:
test1.snk:
rule test:
output:
"{filename}"
wildcard_constraints:
filename = "[abc]"
shell:
"echo x > {output}"
蛇文件:
configfile: "config.yaml"
rule all:
input:
expand("{sample}", sample=config["fileName"])
include: "test1.snk"
config.yaml
fileName: ['a','b','c']
$snakemake -n:
rule test:
output: a
jobid: 1
wildcards: filename=a
rule test:
output: c
jobid: 2
wildcards: filename=c
rule test:
output: b
jobid: 3
wildcards: filename=b
localrule all:
input: a, b, c
jobid: 0
Job counts:
count jobs
1 all
3 test
4
附加信息
此外,此设置的扩展性非常好 :) 仅使用 CLI 调用 Snakemake 运行它,没有任何参数。喜欢:
snakemake
虽然这是一种糟糕的做法,但从技术上讲,如果您更注重“结果”并且不关心可重复性,那么它也是可能的。
snakemake -n -s "test1.snk" a b c
这基本上只针对规则“test1.snk”并从它请求“a”、“b”和“c”。
rule test:
output: c
jobid: 0
wildcards: filename=c
rule test:
output: b
jobid: 1
wildcards: filename=b
rule test:
output: a
jobid: 2
wildcards: filename=a
Job counts:
count jobs
3 test
3
你可以看到试运行调用实际上是不同的,因为它没有访问“全部规则”,因此没有第 4 个工作。总体而言,Snakemake 的处理与 shell 命令执行的处理相比通常是微不足道的。如果没有“全部”规则,我预计性能差异很小。然而,使用 all 规则,您的代码应该在做什么变得更加清晰,并且您可以轻松地重新运行完全相同的命令,而无需“grep”您的“历史”。