有一个程序(我无法修改)创建两个输出文件。我试图围绕这个程序编写一个Python包装器,它通过管道将这个程序的两个输出流式化,并将两个输出交错为一个输出,一次4行。
我在Bash中实现了一个工作包装器。它有很多嵌套的流程替换,命名管道等等。
mkfifo out1
mkfifo out2
./someProgram out1 out2 &
paste <(paste - - - - < out1) <(paste - - - - < out2) | tr '\t' '\n'
wait
rm out1 out2
我现在正试图将其翻译成Python。
# `named_pipes()` function as defined in http://stackoverflow.com/a/28840955/459780
with named_pipes(4) as paths:
data1, data2, paste1, paste2 = paths
proc1 = Popen(['./someProgram', data1, data2])
with open(data1, 'r') as stream1, open(data2, 'r') as stream2, \
open(paste1, 'w') as stream3, open(paste2, 'w') as stream4:
pastecmd = ['paste', '-', '-', '-', '-']
proc2 = Popen(pastecmd, stdin=stream1, stdout=stream3)
proc3 = Popen(pastecmd, stdin=stream2, stdout=stream4)
proc4 = Popen(['paste', paste1, paste2], stdout=PIPE)
proc5 = Popen(['tr', "'\t'", "'\n'"], stdin=proc4.stdout)
proc5.communicate()
proc1.wait()
它已陷入僵局,可能是因为我没有正确调用communicate()
和wait()
函数。我做错了什么?
编辑:以下虚拟脚本的行为与感兴趣的程序类似。如果您确实想要运行上面的Bash和Python代码,请将其另存为someProgram
。
#!/usr/bin/env python
from __future__ import print_function
import sys
with open(sys.argv[1], 'w') as f1, open(sys.argv[2], 'w') as f2:
for i in range(1000):
print('@read{}/1'.format(i), 'ACGT'*25, '+', 'BBBB'*25, sep='\n', file=f1)
print('@read{}/2'.format(i), 'ACGT'*25, '+', 'BBBB'*25, sep='\n', file=f2)