Snakemake:如何在同一调用的多个实例中维护一个类似蛇的实例值

Snakemake: how maintain a snakelike instance value across multiple instances of the same invocation

我想在我的 snake 文件的 python 代码中保存一些信息,并在 snakemake 创建的每个实例中将此信息提供给 python 代码 运行调整工作流程。但是单独的 运行 工作流应该有自己单独的信息实例。

例如,假设我要在 python 代码中创建一个 UUID,然后在 python 代码中使用它。但我希望 UUID 在工作流的所有 运行ning 实例中都相同。相反,每次启动实例时都会创建一个新的 UUID。

如果我同时启动 snakemake 两次,我希望两个 运行 中的每一个都创建自己的 UUID,但是在每个 运行 中,所有实例都由 运行 将使用相同的 UUID。这该怎么做? snakemake 对象中某处是否有一个标识符在所有实例中的一个 运行 中保持不变,但从 运行 运行?

变化

这是一个因 'No rule to produce' 错误而失败的示例:

import uuid
ID = str(uuid.uuid4())
print("ID:", ID)

rule all:
    output: ID
    run: print("Hello world")

如果它使用 'shell' 而不是 'run',它工作正常,所以我假设 Snakemake 在执行 "run" 时正在重新 运行 蛇文件代码规则的一部分。如何对其进行修改以保留第一个 UUID 值而不是生成第二个值?另外,为什么在第一次处理规则时没有为规则中的输出指定 ID,而不需要第二次调用 python 代码?由于它与 'shell' 一起使用,因此不需要专门用于处理 "output" 语句的第二次调用。

事实上,当你使用 运行 块时,Snakemake 将调用自身来执行该作业,这意味着它还会重新解析 Snakefile,生成一个新的 UUID。集群上也会发生同样的情况。这样做有充分的技术原因(性能、Python GIL、酸洗限制、实现的简单性和稳健性)。

我不确定你到底想达到什么目的,但看看这个可能会有所帮助:http://snakemake.readthedocs.io/en/stable/project_info/faq.html#i-want-to-pass-variables-between-rules-is-that-possible

我找到了一个似乎有效的方法:使用进程组 ID:

ID = str(os.getpgrp())

同一管道的多个实例具有相同的组 ID。但是,我不确定这在集群上是否仍然适用,可能不是。就我而言,这无关紧要。