在Python中嵌套进程替换和命名管道

时间:2016-06-08 23:31:26

标签: python subprocess pipeline

有一个程序(我无法修改)创建两个输出文件。我试图围绕这个程序编写一个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)

0 个答案:

没有答案