Snakemake 重新运行触发器不会导致相关步骤重新运行

问题描述 投票:0回答:1

在两步工作流程中,如果我运行工作流程完成,然后意识到我必须重新运行步骤 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
1个回答
0
投票

我刚刚测试过,我认为您遇到了与此处所解释的相同问题。
涉及微小文件的玩具管道会误导您,因此您必须进行更改或解决它。

我设置测试输出大小的方法是首先使用您的代码运行以下两个命令:

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) 会讨论更多解决方法。或者有一个需要使用小文件的实际任务。

© www.soinside.com 2019 - 2024. All rights reserved.