You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake生命游戏工作流报错:gridEmpty()参数不匹配求助

Snakemake条件工作流input函数参数错误解决

问题场景

基于Snakemake构建生命游戏工作流,目标实现条件迭代:每完成一个时间步的网格计算后,检查网格是否为空,若为空则停止后续时间步计算,用已生成的所有时间步画面渲染视频。当前通过checkpoint和自定义input函数gridEmpty()实现逻辑,但运行时触发参数错误。

错误信息

Error: TypeError: gridEmpty() takes 0 positional arguments but 1 was given Wildcards:

Traceback:

现有Snakefile代码

configfile: "config_exercise_2.yaml"
workdir: "../"

import numpy as np

Time = 1
def gridEmpty():
    global Time
    with open(checkpoints.CalculateNextTimeStep.get(time=Time).output[0],"rb") as f:
        if np.all(np.load(f) == 0): #grid is empty, no more timesteps required
            return [f"pictures/picture_t-{i}.jpg" for i in range(0,Time+1,1)]
        else: #grid is not empty, more timesteps required
            Time += 1
            checkpoints.CalculateNextTimeStep.get(time=Time)
                                                   
rule RenderVideo:
    input:
        gridEmpty
    output:
        "video/clip.mp4"
    params:
        framerate = config["FrameRate"]
    shell:
        "cat {input} | ffmpeg -framerate {params.framerate} -f image2pipe -i - {output}"
        
rule Displaytimestep:
    input:
        "arrays/array_t-{time}.npy"
    output:
        "pictures/picture_t-{time}.jpg"
    conda:
        "../environment/environment.yaml"
    params:
        timeStep = lambda wildcards: wildcards.time
    script:
        "../scripts/DisplayTimeStep.py"
    
checkpoint CalculateNextTimeStep:
    input:
        lambda wildcards: f"arrays/array_t-{int(wildcards.time)-1}.npy"
    output:
        "arrays/array_t-{time}.npy"
    params:
        GridSize = config["GridSize"]
    conda:
        "../environment/environment.yaml"
    script:
        "../scripts/CalculateNextTimeStep.py"

解决思路

Snakemake的规则input中指定的自定义函数,无论当前规则是否包含通配符,都会自动传入一个wildcards参数。你的gridEmpty()函数没有定义参数,导致触发类型错误。

只需修改函数定义,添加wildcards参数(即使函数内部不需要使用这个参数)即可解决:

def gridEmpty(wildcards):  # 添加wildcards参数
    global Time
    with open(checkpoints.CalculateNextTimeStep.get(time=Time).output[0],"rb") as f:
        if np.all(np.load(f) == 0): #grid is empty, no more timesteps required
            return [f"pictures/picture_t-{i}.jpg" for i in range(0,Time+1,1)]
        else: #grid is not empty, more timesteps required
            Time += 1
            checkpoints.CalculateNextTimeStep.get(time=Time)

这个修改让函数符合Snakemake的调用规范,就能正常执行空网格检测的逻辑了。

内容的提问来源于stack exchange,提问作者newuser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:55:19