【问题标题】:Always run rule in Snakefile (snakemake)始终在 Snakefile (snakemake) 中运行规则
【发布时间】:2016-04-08 10:05:19
【问题描述】:

我正在为 snakemake 工作流程编写 Snakefile。作为我工作流程的一部分,我需要检查数据库中的一组记录是否已更改,以及它们是否已重新下载。

我的想法是编写一个规则来检查数据库时间戳并将其写入输出文件。并使用时间戳文件作为我的下载规则的输入。问题是一旦写入时间戳文件,时间戳规则将永远不会再次运行,因此时间戳将永远不会更新。

有没有办法让这条规则每次都运行。 (我知道我可以从 shell 强制它,但我想在 Snakefile 中指定它)或者,有没有更好的方法来处理这个?

【问题讨论】:

    标签: python snakemake


    【解决方案1】:

    您在规则或函数定义之外添加到 Snakefile 的任何代码都将像常规 Python 脚本一样在启动时运行,因此您不需要外部 shell 脚本。您可以在 Snakefile 中直接在 Python 中实现您想要的逻辑,如果需要,可以使用 shell() 函数。

    需要注意的是,如果您尝试在集群上运行工作流,则每次提交的每个集群作业都会运行代码。避免这种情况的一种粗略但有效的方法是用这样的检查来保护它:

    if '--nolock' not in sys.argv:
        if check_database_for_updates():
            os.utime('touch.file')
    

    然后将 touch.file 设置为从数据库读取的规则的代理输入。这有意义吗?

    蒂姆

    【讨论】:

    • 从最近开始,Snakefile 中的代码会针对每个作业执行,而不仅仅是在集群上时。所以上面的配方也适用于单机设置。
    【解决方案2】:

    自 v3.6.0 起,onstart 处理程序允许始终在工作流开始之前执行某些操作。

    Snakemake 3.6.0 添加了一个onstart 处理程序,它将在工作流开始之前执行。请注意,试运行不会触发任何处理程序。

    很遗憾onstart 在试运行期间没有被触发。

    类似地,onsuccessonerrorhandlers 可用于根据工作流的成功和错误分别触发要执行的操作。

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      相关资源
      最近更新 更多