6

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

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

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

4

2 回答 2

6

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

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

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

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

蒂姆

于 2016-04-28T10:34:27.803 回答
4

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

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

不幸的是,onstart在试运行期间没有触发。

同样,onsuccess处理onerror程序可用于根据工作流的成功和错误分别触发要执行的某些内容。

于 2017-12-12T15:59:08.747 回答