2016-04-08 26 views
2

我正在为snakemake工作流编写Snakefile。作为我的工作流程的一部分,我需要检查数据库中的一组记录是否发生了变化,以及它们是否已经重新下载它们。始终运行Snakefile中的规则(snakemake)

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

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

回答

3

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

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

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

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

TIM

0

由于V3.6.0,onstart处理程序允许工作流程开始之前始终执行的东西。

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

不幸的是onstart在干运行过程中没有被触发。

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