我想在我的蛇文件的一部分python代码中保存一些信息,并让蛇make在运行工作流程时创建的每个实例中的python代码都可以使用这些信息。但是,单独运行工作流应具有自己的独立信息实例。
例如,假设我要在python代码中创建一个UUID,然后在python代码中使用它。但是我希望UUID在工作流的所有正在运行的实例中都相同。相反,每次启动实例时都会创建一个新的UUID。
如果我同时启动两次snakemake,我希望两个运行中的每一个都创建自己的UUID,但是在每次运行中,该运行创建的所有实例都将使用相同的UUID。这该怎么做?
在snakemake对象的某个地方是否存在一个标识符,该标识符在所有实例的一次运行中都保持不变,但是每次运行之间都会发生变化?这是一个示例,失败并显示“无规则可产生”错误:
import uuid
ID = str(uuid.uuid4())
print("ID:", ID)
rule all:
output: ID
run: print("Hello world")
如果使用'shell'代替'run',它可以正常工作,因此我认为Snakemake在执行规则的“ run”部分时正在重新运行snakefile代码。如何修改它以使其工作,以保留第一个UUID值而不生成第二个UUID?另外,为什么在第一次处理规则时却没有捕获为规则中输出指定的ID,而无需再次调用python代码?由于它与“ shell”一起使用,因此不需要专门进行第二次调用来处理“输出”语句。
答案 0 :(得分:1)
实际上,当您使用运行块时,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
答案 1 :(得分:0)
我发现了一种似乎可行的方法:使用进程组ID:
ID = str(os.getpgrp())
同一管道的多个实例具有相同的组ID。但是,我不确定在集群上是否仍然如此,也许不是。就我而言,没关系。