代码之家  ›  专栏  ›  技术社区  ›  Nikita Vlasenko

Snakemake只传递输出到shell命令中的第一个路径

  •  0
  • Nikita Vlasenko  · 技术社区  · 6 年前

    我试图将所有路径同时输入到一个变量中 python 编写脚本 snakemake

    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 中的参数 脚本它只看到第一条路径: 'results/neo4j/{sample}/cells.csv' 输出 python

    2 回复  |  直到 6 年前
        1
  •  2
  •   bli    6 年前

    neo4j.py 脚本不接受多个文件 -output 参数:shell命令可能以文件的完整列表结尾(检查 -p 选择 snakemake ),但脚本只考虑第一个。

    如果确实是这样的话,一个可能更干净的方法是修改 编写脚本,以便对每个输出文件使用一个参数。

    然后按如下方式修改规则:

    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}
            """
    


    编辑

    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
  •  1
  •   The Unfun Cat    6 年前
    rule hello:
        output:
            "woot", "hoot"
        run:
            for f in output:
                print(f)
            print(output[1])