始终在Snakefile中运行规则(snakemake)

时间:2016-04-08 10:05:19

标签: python snakemake

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

TIM

答案 1 :(得分:2)

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

  

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

不幸的是onstart在干跑期间没有被触发。

类似地,onsuccessonerror处理程序可用于分别根据工作流程的成功和错误触发要执行的内容。