正如您在标题中所读到的,我对存储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}可用。在
谢谢!在
这是将访问设置为用作Python变量。在
但是,您尝试通过{SAMTOOLS},将其作为特定于Snakemake规则的通配符来访问它:
^{pr2}$Snakemake通配符的访问方式与Python变量不同。 此外,{SAMTOOLS}在这里作为Snakemake通配符被访问,但是在规则的输出中您并没有将其用作通配符
假设{通配符.chr}工作正常,{SAMTOOLS}调用是唯一未找到的通配符(而不仅仅是第一个未知的通配符),我认为您应该尝试两种方法中的任何一种。在
无预分配:
^{3}$将其作为python变量作为字符串访问(它是一个表示字符串的对象):
最后,也是最不推荐的,因为它引入了规则-规则耦合,在Snakemake中有一些方法可以跨规则传递变量,而且您已经在使用它了,但是,我不认为这是这里需要的。适当的访问和设计应该足够了。在
Snakemake Tutorial FAQ: How to pass variables between rules
旁注
为了消除字符深度在规则之间的传递,并将其保存为文件名的路径,并将规则解耦,我强烈建议将chrdeph转换为命名通配符。。。在
像是。。。在
但我不知道你是怎么计算chrDepth的。我担心的是,您在所有这些规则之间传递它,而不仅仅依赖于良好的命名约定。它可能不必要地耦合您的代码,导致问题和下游开销。在
相关问题 更多 >
编程相关推荐