Snakemake执行报错:规则定义中出现意外关键字filePath
Snakemake语法错误修复方案
执行命令
$snakemake -s bsmooth_Snakefile.smk -np --forcerun
报错信息
SyntaxError in file /scripts/bsmooth_snakemake/bsmooth_Snakefile.smk, line 9: Unexpected keyword filePath in rule definition (bsmooth_Snakefile.smk, line 9)
相关文件内容
Snakefile 文件 (bsmooth_Snakefile.smk)
$ cat bsmooth_Snakefile.smk configfile: "config/config.yaml" configfile: "config/samples.yaml" rule all: input: expand("results/bsmooth_fit/{sample}/{sample}.fitted.rda", sample=config["samples"]) rule bsmooth_fit: input: filePath=lambda wildcards: config["samples"][wildcards.samples] output: bsfit="results/{rule}/{sample}/{sample}.fitted.rda" params: rscript=config["BSmooth_fit"] log: "logs/{rule}/{sample}.log" shell: "Rscript {params.rscript} --sample {wildcards.samples} --file {input.filePath} --outfile {output.bsfit} 2> {log}"
样本配置文件 (sample.yaml)
$cat sample.yaml samples: Sample1Tumor: methylation_coverage/Sample1Tumor.bismark.cov.gz Sample1Norm: methylation_coverage/Sample1Norm.bismark.cov.gz
全局配置文件 (config.yaml)
$cat config.yaml BSmooth_fit: scripts/bsmooth_snakemake.r
问题原因与修复方案
报错由两处问题共同导致:
- 通配符名称不匹配:规则中定义的通配符是
{sample},但在lambda表达式和shell命令中却引用了wildcards.samples,正确的变量名应为wildcards.sample。 rule all中的expand参数错误:config["samples"]是一个字典,直接传入expand会使用键值对而非样本名称,需要改为取字典的keys。
修正后的完整代码如下:
修正后的rule all
rule all: input: expand("results/bsmooth_fit/{sample}/{sample}.fitted.rda", sample=config["samples"].keys())
修正后的rule bsmooth_fit
rule bsmooth_fit: input: filePath=lambda wildcards: config["samples"][wildcards.sample] output: bsfit="results/{rule}/{sample}/{sample}.fitted.rda" params: rscript=config["BSmooth_fit"] log: "logs/{rule}/{sample}.log" shell: "Rscript {params.rscript} --sample {wildcards.sample} --file {input.filePath} --outfile {output.bsfit} 2> {log}"
应用以上修改后,重新执行Snakemake命令即可解决该语法错误。
内容的提问来源于stack exchange,提问作者sahuno
相关产品推荐
相关产品推荐

