在两步工作流程中,如果我运行工作流程完成,然后意识到我必须重新运行步骤 1,我希望如果我使用 --force 运行步骤 1,则步骤 2 将在整个过程的下一次调用时运行工作流程。
最小示例 给定这个名为
bad.snakefile
: 的蛇文件
rule runall:
input: "bye.txt"
output: "hello.txt"
shell: "echo hello > {output}"
rule realoutput:
output: "bye.txt"
shell: "echo bye > {output}"
snakemake --snakefile bad.snakefile --cores 1
。 它成功运行并运行这两个步骤。snakemake --snakefile bad.snakefile --cores 1 --force realoutput
重新运行步骤 1。 这样第一步就成功运行了。snakemake --snakefile bad.snakefile --cores 1
。 这应该会导致重新运行步骤 2。 然而,它说一切都完成了。 但很明显,步骤 1 输出的 mtime 大于步骤 2 输出的 mtime。 这不是通过添加 --rerun-triggers=mtime
来解决的。摘要命令显示时间戳与工作流程的预期不符,显示“无需执行任何操作(所有请求的文件都存在且是最新的)。”:
$> snakemake --snakefile bad.snakefile --cores 1 --summary
Building DAG of jobs...
output_file date rule log-file(s) status plan
hello.txt Thu Sep 19 11:25:20 2024 runall ok no update
bye.txt Thu Sep 19 11:30:04 2024 realoutput ok no update
如果我这样做
snakemake --snakefile bad.snakefile --cores 1 --forcerun realoutput
,它就能正常工作。 然而,这迫使我立即运行所有步骤。 我希望重新运行步骤 1,然后有机会检查结果。 然后,我想继续重新运行相关步骤。
我刚刚测试过,我认为您遇到了与此处所解释的相同问题。
涉及微小文件的玩具管道会误导您,因此您必须进行更改或解决它。
我设置测试输出大小的方法是首先使用您的代码运行以下两个命令:
snakemake -c1
snakemake -c1 realoutput --force
然后当我跑
snakemake -c1 --summary
和snakemake -c1
时,我看到了你所看到的。时间戳显示bye.txt
是稍后制作的,但snakemake没有处理。
因此,现在要测试它是否是我将
shell: "echo bye > {output}"
规则中的 realoutput
行更改为以下尺寸:
shell: "cat index.ipynb > {output}"
(
index.ipynb
是我手边的一个大小合适的文件。使用任何你想要的大小合适的文件。)
然后我对snakemake执行了相同的步骤,实际上是使用命令行上的箭头键来运行相同的命令,现在如果我刚刚运行
realoutput
,它想再次更新。如果我包含 update pending
并运行 --summary
,我会看到 snakemake -c1
现在再次运行 runall
规则。
那里 如果您坚持在玩具管道中使用微小数据,蒂姆·布斯 (Tim Booth) 会讨论更多解决方法。或者有一个需要使用小文件的实际任务。