Subworkflow作为隐式依赖配置失败:MissingOutputException异常求助
首先,你的思路方向是对的,但核心问题出在bridge规则的input和output指向了同一个文件——这在Snakemake中会触发逻辑冲突:Snakemake认为bridge规则需要生成.work/data/a.txt,但这个文件已经被subworkflow生成了,而bridge规则本身没有执行任何实际的文件生成操作,因此会抛出MissingOutputException。
修正步骤
要让bridge规则正确触发subworkflow并满足下游规则的依赖,需要调整路径逻辑,确保bridge规则的input和output是不同的文件:
明确subworkflow的输出路径:你的subworkflow设置了
workdir: ".work",所以内部Snakefile生成的文件会放在.work目录下。假设subworkflow最终生成的是.work/data/a.txt(对应你调用anotherworkflow("data/a.txt")的目标)。调整bridge规则的输出为下游规则需要的路径:如果下游规则需要的是
data/a.txt,那么bridge规则应该把subworkflow的输出文件“桥接”到这个路径,示例如下:
rule all: input: "data/a.txt" # 下游规则依赖的目标文件 subworkflow anotherworkflow: workdir: ".work" snakefile: "another.Snakefile" rule bridge: input: anotherworkflow("data/a.txt") # 触发subworkflow生成.work/data/a.txt output: "data/a.txt" # 下游规则实际依赖的文件 shell: # 根据需求选择复制或链接命令 "cp {input} {output}" # Windows MinGW环境也可以用原生命令:"copy {input} {output}" # 大文件推荐硬链接:"ln {input} {output}"(MinGW需确保环境支持)
这样,当任何规则需要data/a.txt时,Snakemake会先执行bridge规则;bridge规则的input依赖会自动触发subworkflow生成.work/data/a.txt,最后通过shell命令将文件复制/链接到目标路径,完美满足下游依赖。
方案可行性与跨平台问题
- 方案可行性:这种“bridge规则+subworkflow”的方式是完全可行的,是Snakemake中实现subworkflow自动触发的常用模式,核心是确保规则的依赖链清晰,input/output路径不冲突。
- Windows+MinGW兼容性:在Windows下使用MinGW时,需要注意两点:
- 路径分隔符:尽量使用正斜杠
/,Snakemake会自动处理为Windows兼容的反斜杠\; - shell命令:如果
cp命令出现问题,可以换成Windows原生的copy命令;硬链接ln在MinGW中可能需要调整参数,稳妥起见用复制命令更适配Windows环境。
- 路径分隔符:尽量使用正斜杠
只要路径设置正确,shell命令适配MinGW环境,这个方案在Windows下也能正常运行。
内容的提问来源于stack exchange,提问作者Dmitry Kuzminov

