我正在为 snakemake 工作流程编写 Snakefile。作为我工作流程的一部分,我需要检查数据库中的一组记录是否已更改,以及它们是否已重新下载。
我的想法是编写一个规则来检查数据库时间戳并将其写入输出文件。并使用时间戳文件作为我的下载规则的输入。问题是一旦写入时间戳文件,时间戳规则将永远不会再次运行,因此时间戳将永远不会更新。
有没有办法让这条规则每次都运行。(我知道我可以从外壳强制它,但我想在 Snakefile 中指定它)或者,有没有更好的方法来处理这个?
您在规则或函数定义之外添加到 Snakefile 的任何代码都将在启动时运行,就像常规 Python 脚本一样,因此您不需要外部 shell 脚本。你可以在 Snakefile 中用 Python 实现你想要的逻辑,如果你需要的话,可以使用 shell() 函数。
一个警告是,如果您尝试在集群上运行工作流,则每次提交的每个集群作业都会运行代码。避免这种情况的一种粗略但有效的方法是用这样的检查来保护它:
if '--nolock' not in sys.argv:
if check_database_for_updates():
os.utime('touch.file')
然后将 touch.file 设置为从数据库读取的规则的代理输入。那有意义吗?
蒂姆
从 v3.6.0 开始,onstart
处理程序允许始终在工作流开始之前执行某些操作。
Snakemake 3.6.0 添加了一个
onstart
处理程序,它将在工作流开始之前执行。请注意,试运行不会触发任何处理程序。
不幸的是,onstart
在试运行期间没有触发。
同样,onsuccess
处理onerror
程序可用于根据工作流的成功和错误分别触发要执行的某些内容。