我不明白如何重新定义我的蛇形规则来修复下面的通配符问题。
忽略批处理的逻辑,它在python脚本内部是有意义的。理论上,我希望该规则对每批1-20运行。我在输出中为{batch}使用batch列表,在shell命令中,我使用{wildcards.batch}:
OUTDIR="my_dir/"
nBATCHES = 20
BATCHES = list(range(1,21)) # [1,2,3 ..20] list
[...]
rule step5:
input:
ids = expand('{IDLIST}', IDLIST=IDLIST)
output:
type1 = expand('{OUTDIR}/resources/{batch}_output_type1.csv.gz', OUTDIR=OUTDIR, batch=BATCHES),
type2 = expand('{OUTDIR}/resources/{batch}_output_type2.csv.gz', OUTDIR=OUTDIR, batch=BATCHES),
type3 = expand('{OUTDIR}/resources/{batch}_output_type3.csv.gz', OUTDIR=OUTDIR, batch=BATCHES)
shell:
"./some_script.py --outdir {OUTDIR} --idlist {input.ids} --total_batches {nBATCHES} --current_batch {wildcards.batch}"
错误:
RuleException in rule step5 in line 241 of Snakefile:
AttributeError: 'Wildcards' object has no attribute 'batch', when formatting the following:
./somescript.py --outdir {OUTDIR} --idlist {input.idlist} --totalbatches {nBATCHES} --current_batch {wildcards.batch}
手动执行单个批处理脚本看起来像这样(并且工作):(total_batches是一个常量;Current_batch应该迭代)
./somescript.py --outdir my_dir/ --idlist ids.csv --total_batches 20 --current_batch 1
您似乎想为BATCHES
中的每个batch
运行一次rule step5
。所以你需要构建你的Snakefile
来做到这一点。
在以下Snakefile
运行rule all
运行rule step5
为OUTDIR
和BATCHES
的所有组合:
OUTDIR = "my_dir"
nBATCHES = 20
BATCHES = list(range(1, 21)) # [1,2,3 ..20] list
IDLIST = ["a", "b"] # dummy data, I don't have the original
rule all:
input:
type1=expand(
"{OUTDIR}/resources/{batch}_output_type1.csv.gz",
OUTDIR=OUTDIR,
batch=BATCHES,
),
rule step5:
input:
ids=expand("{IDLIST}", IDLIST=IDLIST),
output:
type1="{OUTDIR}/resources/{batch}_output_type1.csv.gz",
type2="{OUTDIR}/resources/{batch}_output_type2.csv.gz",
type3="{OUTDIR}/resources/{batch}_output_type3.csv.gz",
shell:
"./some_script.py --outdir {OUTDIR} --idlist {input.ids} --total_batches {nBATCHES} --current_batch {wildcards.batch}"
在你的早期版本{batches}
只是一个expand
占位符,但不是通配符,规则只被调用一次。
代替rule all
,这可以是一个后续规则,使用step5
生成的一个或多个输出。