存储shell命令的结果

2024-10-03 02:39:07 发布

您现在位置:Python中文网/ 问答频道 /正文

正如您在标题中所读到的,我对存储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!但那只是为了测试。在

我试图解决的错误是中的{SAMTOOLS}的值subprocess.check_输出()! 在

^{pr2}$

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

1)读取{SAMTOOLS}的正确值!在

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

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

谢谢!在


Tags: 命令inputoutput规则shellsortruleindividual
1条回答
网友
1楼 · 发布于 2024-10-03 02:39:07

这是将访问设置为用作Python变量。在

SAMTOOLS = config["SAMTOOLS"]

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

^{pr2}$

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

假设{通配符.chr}工作正常,{SAMTOOLS}调用是唯一未找到的通配符(而不仅仅是第一个未知的通配符),我认为您应该尝试两种方法中的任何一种。在

无预分配:

^{3}$

将其作为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

旁注

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

像是。。。在

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

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

相关问题 更多 >