【问题标题】:Snakemake: Parameter as wildcard used in parallel script runsSnakemake:参数作为并行脚本运行中使用的通配符
【发布时间】:2022-11-01 17:15:07
【问题描述】:

我对snakemake相当陌生,并继承了一种巨大的工作流程,该工作流程包含一系列17条连续运行的规则。 每个规则都从前面的规则中获取输出,并使用它们来运行 python 脚本。到目前为止,一切都很好,除了现在我正在尝试改进工作流程,因为一些规则可以并行运行。

我试图实现的一个粗略示例,我的理解是通配符应该允许我解决这个问题。


grid = [ 10 , 20 ]

rule all:
input:
    expand("path/to/C/{grid}/file_C" ,grid = grid)

rule process_A:
input:
    path_A = "path/to/A/file_A"
    path_B = "path/to/B/{grid}/file_B" # A rule further in the worflow could need a file from a previous rule saved with this structure
params:
    grid = lambda wc: wc.get(grid)
output:
    path_C = "path/to/C/{grid}/file_C"
shell:
    "script_A.py {params.grid}"
   

在脚本中,我检索了网格大小参数:

grid = snakemake.params.grid

最后,应该使用 grid = 10 和 grid = 20 重新运行整个规则 process_A,并将每个结果保存到其路径也取决于 grid 的文件夹中。

我知道这有几处问题,但我似乎无法找到从开始解决这个问题的方法。我现在得到的错误是:

name 'params' is not defined

关于从哪里开始的任何帮助?

【问题讨论】:

    标签: python-3.x snakemake


    【解决方案1】:

    发布name 'params' is not defined 的错误堆栈跟踪以准确了解导致它的原因会很有用。目前...

    在脚本中,我检索了网格大小参数:

    网格=snakemake.params.grid

    我怀疑您将 script 指令与 shell 指令混合在一起。可能你想要类似的东西:

    rule process_A:
        input: ...
        output: ...
        params: ...
        script:
            "script_A.py"
    

    script_A.py 内,snakemake 将用实际的参数值替换 snakemake.params.grid

    或者,编写一个解析命令行参数的独立 python 脚本,然后像使用 shell 指令的任何其他程序一样执行。 (我更喜欢这种解决方案,因为它使事情更明确,更容易调试,但它也意味着编写独立脚本的样板代码更多)。

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多