首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Snakemake只将输出中的第一个路径传递给shell命令。

Snakemake只将输出中的第一个路径传递给shell命令。
EN

Stack Overflow用户
提问于 2018-08-30 03:46:08
回答 2查看 337关注 0票数 0

我试图将一个变量中的所有路径同时提供给snakemake中的一个snakemake脚本,如下所示:

代码语言:javascript
运行
复制
rule neo4j:
  input:
      script = 'python/neo4j.py',
      path_to_cl = 'results/clusters/umap/{sample}_umap_clusters.csv',
      path_to_umap = 'results/umap/{sample}_umap.csv',
      path_to_mtx = 'data_files/normalized/{sample}.csv'
  output: 'results/neo4j/{sample}/cells.csv', 'results/neo4j/{sample}/genes.csv', 
      'results/neo4j/{sample}/cl_nodes.csv', 'results/neo4j/{sample}/cl_contains.csv',
      'results/neo4j/{sample}/cl_isin.csv', 'results/neo4j/{sample}/expr_by.csv',
      'results/neo4j/{sample}/expr_ess.csv'
  shell:
      "python {input.script} -path_to_cl {input.path_to_cl} -path_to_umap {input.path_to_umap} -path_to_mtx {input.path_to_mtx} -output {output}"

当我在访问output脚本中的python参数时,它只看到第一个路径:'results/neo4j/{sample}/cells.csv'。我也试着命名每条路,但它没有解决这个问题。如何将规则的output中的所有路径作为数组或字典传递,以便以后能够在python中访问它们

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-31 14:12:06

如果我正确理解您的问题,您的问题是neo4j.py脚本不能为其-output参数接受多个文件: shell命令可能以完整的文件列表(使用snakemake-p选项检查)结束,但是脚本只考虑了第一个文件。

如果确实如此,一种可能更简洁的方法是修改neo4j.py脚本的接口,以便它为每个输出文件使用一个参数。

然后,您将修改规则如下:

代码语言:javascript
运行
复制
rule neo4j:
    input:
        script = 'python/neo4j.py',
        path_to_cl = 'results/clusters/umap/{sample}_umap_clusters.csv',
        path_to_umap = 'results/umap/{sample}_umap.csv',
        path_to_mtx = 'data_files/normalized/{sample}.csv'
    output:
        cells = 'results/neo4j/{sample}/cells.csv',
        genes = 'results/neo4j/{sample}/genes.csv',
        nodes = 'results/neo4j/{sample}/cl_nodes.csv',
        contains = 'results/neo4j/{sample}/cl_contains.csv',
        isin = 'results/neo4j/{sample}/cl_isin.csv',
        by = 'results/neo4j/{sample}/expr_by.csv',
        ess = 'results/neo4j/{sample}/expr_ess.csv'
    shell:
        """
        python {input.script} \\
            --path_to_cl {input.path_to_cl} \\
            --path_to_umap {input.path_to_umap} \\
            --path_to_mtx {input.path_to_mtx} \\
            --cells {output.cells} \\
            --genes {output.genes} \\
            --nodes {output.nodes} \\
            --contains {output.contains} \\
            --isin {output.isin} \\
            --by {output.by} \\
            --ess {output.ess}
        """

一些可能有用的python模块用于设置脚本的接口:

编辑

如果不希望将每个输入文件作为单独的参数传递,则只需传递输出目录,并让脚本从这个单个参数构建输出路径。给定您想要的文件名,这似乎是可能的:

代码语言:javascript
运行
复制
rule neo4j:
    input:
        script = 'python/neo4j.py',
        path_to_cl = 'results/clusters/umap/{sample}_umap_clusters.csv',
        path_to_umap = 'results/umap/{sample}_umap.csv',
        path_to_mtx = 'data_files/normalized/{sample}.csv'
    output:
        'results/neo4j/{sample}/cells.csv',
        'results/neo4j/{sample}/genes.csv',
        'results/neo4j/{sample}/cl_nodes.csv',
        'results/neo4j/{sample}/cl_contains.csv',
        'results/neo4j/{sample}/cl_isin.csv',
        'results/neo4j/{sample}/expr_by.csv',
        'results/neo4j/{sample}/expr_ess.csv'
    shell:
        """
        python {input.script} \\
            --path_to_cl {input.path_to_cl} \\
            --path_to_umap {input.path_to_umap} \\
            --path_to_mtx {input.path_to_mtx} \\
            --out_dir results/neo4j/{wildcards.sample}
        """
票数 2
EN

Stack Overflow用户

发布于 2018-08-30 07:03:10

代码语言:javascript
运行
复制
rule hello:
    output:
        "woot", "hoot"
    run:
        for f in output:
            print(f)
        print(output[1])

印上“呜呜”、“呜呜”、“呜呜”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52088953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档