存储shell命令的结果

时间:2017-08-28 09:01:37

标签: python shell snakemake

正如您可以阅读标题我感兴趣的是存储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]}")

我确实因为退出1而收到错误!但那只是为了测试。

我想解决的错误是subprocess.check_output()中{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的地址可配置。但是,我不能在这里:

1)阅读{SAMTOOLS}的正确值!

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

这是您设置用作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中跨规则传递变量,并且您已经在使用它,但是,我不认为这是需要的。正确的访问和设计应该足够了。

Snakemake Tutorial FAQ: How to pass variables between rules

旁注

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

像...一样的东西。

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

但我不确定你是如何计算chrDepth的。我担心你在所有这些规则之间传递它,而不仅仅依赖于良好的命名约定。它可能会不必要地耦合您的代码,从而导致问题和下游开销。

相关问题