我正在为snakemake工作流程编写一个Snakefile。作为我工作流程的一部分,我需要检查数据库中的一组记录是否已更改,以及是否已重新下载它们。
我的想法是编写一个检查数据库时间戳并将其写入输出文件的规则。并使用timestamp文件作为我的下载规则的输入。问题是一旦写入时间戳文件,时间戳规则将永远不再运行,因此永远不会更新时间戳。
有没有办法让这个规则每次运行。 (我知道我可以从shell强制它,但我想在Snakefile中指定它)或者,有没有更好的方法来处理它?</ p>
答案 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
在干跑期间没有被触发。
类似地,onsuccess
和onerror
处理程序可用于分别根据工作流程的成功和错误触发要执行的内容。