代码之家  ›  专栏  ›  技术社区  ›  khikho

存储shell命令的结果

  •  0
  • khikho  · 技术社区  · 7 年前

    正如您在标题中看到的,我对存储shell命令的结果并将其传递给另一个规则感兴趣。

    以下是我的规则:

    SAMTOOLS = config["SAMTOOLS"]
    rule useDepth:
      input:
         depth = "{individual}_{chr}.fixmate.sort.rgmdup.bam.depth"
      output:
         tmpVCF = "{individual}_{chr}.vcf"
      run:
         depth = storage.fetch("chrDepth")
         shell("echo {depth} | exit 1")
    
    rule calDepth:
      input:
         bam = "{individual}.fixmate.sort.rgmdup.bam"
      output:
         temp("{individual}_{chr}.fixmate.sort.rgmdup.bam.depth")
      run:
         import subprocess,shlex
         depth=subprocess.check_output(shlex.split("{SAMTOOLS} depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum / NR}}'"),shell=True)
         storage.store("chrDepth", depth)
         shell("echo \"Depth for {wildcards.chr} has been calculated\" > {output[0]}")
    

    我试图解决的错误是子流程中{SAMTOOLS}的值。检查输出()!

    depth: 1: depth: {SAMTOOLS}: not found
    Error in job chrDepth while creating output file
    RuleException:
    Command '['{SAMTOOLS}', 'depth', '-r', '{wildcards.chr}', '{input.bam}', '|', 'awk', '{{sum += $3}} END {{print sum / NR}}']'
    

    为了提供更多信息,因为不同的用户可能在不同的地方安装samtools,我们通过configfile配置samtools的地址。然而,在这里我不能:

    2) 使整个命令可以运行!

    那么,您能告诉我是否有其他方法可以将规则的输出存储/传递给另一个规则吗!?更具体地说,我如何增强snakemake以告诉shell{SAMTOOLS}可用。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   TBoyarski    7 年前

    这是您设置作为Python变量使用的访问权限。

    SAMTOOLS = config["SAMTOOLS"]
    

    但您尝试通过{SAMTOOLS}将其作为Snakemake规则特定的通配符访问:

    depth=subprocess.check_output(shlex.split("{SAMTOOLS} depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum / NR}}'"),shell=True)
    

    Snakemake通配符的访问方式与Python变量不同。 此外,这里的{SAMTOOLS}是作为Snakemake通配符访问的,但您不将其用作规则输出中的通配符。

    假设{wildcards.chr}有效,并且{SAMTOOLS}调用是唯一未找到的通配符(不仅仅是第一个未知的通配符),我认为您应该尝试两种方法之一。

    无预分配:

    depth=subprocess.check_output(shlex.split("config['SAMTOOLS'] depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum / NR}}'"),shell=True)
    

    将其作为python变量作为字符串访问(它是表示字符串的对象):

    depth=subprocess.check_output(shlex.split(SAMTOOLS + " depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum / NR}}'"),shell=True)
    

    Snakemake Tutorial FAQ: How to pass variables between rules

    旁注

    为了消除跨规则传递的字符深度,并将其保存为文件名的路径,并解耦规则,我强烈建议将chrDepth转换为命名通配符。。。

    类似于。。。

    rule useDepth:
      input:
         depth = "{individual}_{chr}_of_{chrDepth}.fixmate.sort.rgmdup.bam.depth"
      output:
         tmpVCF = "{individual}_{chr}_of{chrDepth}.vcf"