【发布时间】:2017-10-15 18:23:40
【问题描述】:
这是我的输入文件格式:
@SRR2056440.1 1 length=100
TGTAGGTCTGAGCAGCTTGTCCTGGCTGTGTCCATGTCAGAGCAACGGCCCAAGTCTGGGTCTGGGGGGGAAGGTGTCATGGAGCCCCCTACGATTCCCA
+SRR2056440.1 1 length=100
BCBFFFEFHHHHHJJJJJJIJJJJJJJJIJHHIJJIIJJJJJIJJIJJJJJJJJFHIJJJHHHHHHFDDDBDDD>>ACDEDDDDDDDDDDDDDDDDDEDD
@SRR2056440.2 2 length=100
CTGCCGCCACCGCAGCAGCCACAGGCAGAGGAGGACGAGGACGACTGGGAATCGTAGGGGGCTCCATGACACCTTCCCCCCCAGACCCAGACTTGGGCCA
+SRR2056440.2 2 length=100
CCCFFFFFHHHHHJJJJJJJJJJJIJIJIGJGGIGGJIJJEHFEDDDDDDDDDDABDDDDDDDDDDDDDDADDDDDDDDDDDCDDDDDDBBDDCDDBDD@
@SRR2056440.3 3 length=100
TCTGCCGCCACCGCAGCAGCCACAGGCAGAGGAGGACGAGGACGACTGGGAATCGTAGGGGGCTCCATGACACCTTCCCCCCCAGACCCAGACTTGGGCC
+SRR2056440.3 3 length=100
CCCFFFFFHGHHHJJJJJIJJJJJJIJJIJJJIJJIIIGIJ<CDBCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCDDDDDDDDDDDDDDDDDDCDCBDD
这是我要执行的命令:
cat input.fq | awk 'NR%4==2{sum+=length($0);nr++;sumsq+=length($0)*length($0)}END{printf"%.1f\t%.1f\n",sum/nr,sqrt(sumsq/nr-(sum/nr)**2)}'
以及命令的输出:
100.0 0.0
我想使用子进程在 python 脚本中执行该命令。我已经做了几次尝试,但我无法弄清楚,这是我最后一次尝试:
awk_comm = r"""'NR%4==2{sum+=length($0);nr++;sumsq+=length($0)*length($0)}END{printf"%.1f\t%.1f\n",sum/nr,sqrt(sumsq/nr-(sum/nr)**2)}'"""
cmd = ['cat', 'input.fq', '|', 'awk', awk_comm]
p2 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
out1, err = p2.communicate()
编辑:
我在输出中看不到任何错误。它卡住了,永远运行。
【问题讨论】:
-
顺便说一句,
cat input.fq | ...即使在 shell 中也是不好的做法——它会强制您的awk从cat读取 FIFO,这必然比直接从文件读取要慢;此外,使用直接文件句柄,您可以重新阅读、四处寻找等;但是一个 FIFO 只能从前到后读取一次。 -
无论如何,当您使用
shell=True传递一个数组时,结果是subprocess.Popen(['sh', '-c']+yourarray, shell=False)。这意味着唯一作为源传递给 shell 解析的是该数组的 第一个元素。 -
顺便说一句——在使用
shell=True之前,请务必查看 docs.python.org/2/library/… 中的警告。
标签: python