我正在将bash脚本转换为snakemake,并且我希望将之前使用for循环处理的步骤并行化。我遇到的问题是,snakemake没有运行并行进程,而是尝试运行一个具有所有参数的进程,但失败了。
我最初的bash脚本针对参数K
的一系列值多次运行程序。
for num in {1..3}
do
structure.py -K $num --input=fileprefix --output=fileprefix
done
有多个以fileprefix
开头的输入文件。每次运行有两个主要输出,例如对于K=1,它们是fileprefix.1.meanP
,fileprefix.1.meanQ
。我的config和snakemake文件如下。
配置:
cat config.yaml
infile: fileprefix
K:
- 1
- 2
- 3
Snakemake:
configfile: 'config.yaml'
rule all:
input:
expand("output/{sample}.{K}.{ext}",
sample = config['infile'],
K = config['K'],
ext = ['meanQ', 'meanP'])
rule structure:
output:
"output/{sample}.{K}.meanQ",
"output/{sample}.{K}.meanP"
params:
prefix = config['infile'],
K = config['K']
threads: 3
shell:
"""
structure.py -K {params.K} \
--input=output/{params.prefix} \
--output=output/{params.prefix}
"""
这是用snakemake --cores 3
执行的。当我只使用一个线程时,问题仍然存在。
我希望每个K值都能得到上面描述的输出,但运行失败,并显示以下错误:
RuleException:
CalledProcessError in line 84 of Snakefile:
Command ' set -euo pipefail; structure.py -K 1 2 3 --input=output/fileprefix \
--output=output/fileprefix ' returned non-zero exit status 2.
File "Snakefile", line 84, in __rule_Structure
File "snake/lib/python3.6/concurrent/futures/thread.py", line 56, in run
当我将K设置为单个值(如K = ['1']
)时,一切都正常。因此,问题似乎是在执行外壳命令时,{params.K}
被扩展到K的所有值。我今天开始自学snakemake,它真的很好用,但我用它碰壁了。
转载请注明出处:http://www.intrusion-fire.net/article/20230526/1068441.html