我有一个规则 B,它依赖于先前规则 A 创建的日志文件。这些日志文件是由我提交到的集群 (HTCondor) 创建的。这些日志包含集群调度程序正在收集的信息,例如内存使用情况、磁盘使用运行时间等。我的小组正在使用一些脚本来评估此“元数据”,并且我有另一个应该运行这些脚本的规则。
现在来说说我遇到的问题。作业一提交,但在作业本身实际启动之前,集群就会创建 .log 文件。现在,几秒钟后,作业 A 启动并立即删除 .log 文件,因为规则会在重新创建之前删除其输出。这会导致规则失败,因为不会重新创建 .log(并且在任何情况下,此时我需要的信息已经丢失)。
我期望的行为会导致 .log 在规则完成后存在,并在作业提交开始之前删除它的旧实例,以便它只包含单个作业提交的日志。对于 .out 文件,这是有效的,因为集群仅在作业完成后创建它。
rule A:
input:
input.file
output:
output.file
rule_A.log
rule_A.out
rule B:
input:
rule_A.log
我不知道如何获得所需的行为,有什么方法可以用snakemake做到这一点吗?允许我定义在执行之前不应删除的输出的选项是理想的。
我还尝试将rule_A.log放入规则A的日志部分,但这显示了相同的行为。
我对在重新创建输出之前删除其输出的规则有点困惑。你能分享一个可重现的例子吗?或者你的实际规则A?我做了这个,我认为它重现了你的场景:
def create_log_file(wc):
with open("a.log", "w") as f:
f.write("hello world")
return []
rule all:
input:
"b.out",
rule a:
input:
create_log_file, # simulate writing log file before execution
output:
out="a.out",
log="a.log",
shell:
"""
echo a > {output.out}
"""
rule b:
input:
rules.a.output.log,
output:
"b.out",
shell:
"cat {input} > {output}"
运行后,b.out 中包含“hello world”。