объединяет несколько подпроцессов в конвейер

У меня есть 5 процессов p1, p2, ..., p5 , где я хочу записать некоторые данные в stdin p1, направьте вывод p1 в p2 stdin и, наконец, прочтите окончательный результат вывода p5.

То, что я пробовал до сих пор:

p1 = Popen(['p1'], stdin=PIPE, stdout=PIPE)
p2 = Popen(['p2'], stdin=p1.stdout, stdout=PIPE)
...
p5 = Popen(['p5'], stdin=p4.stdout, stdout=PIPE)

# write data to stdin
p1.stdin.write(indata)
p1.stdin.close()

# not sure in what order to close the pipes here, if at all

# read output
out = p5.stdout.read()
print out

Последний вырезанный код просто зависает, потому что я должен выполнять операции чтения / записи неправильно.

Мне удалось заставить работать отдельные процессы, используя communication () и два процесса, не подавая никаких данных на первый (пример из документации Python):

output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

Но я не могу понять, как предоставить ввод для первого процесса без зависания интерпретатора.

Я также мог бы использовать для этого сценарий bash (который я уже написал и работает), но я хотел бы знать, как добиться того же с помощью Python.

Итак , Я хотел бы спросить, как все это сделать правильно, особенно в каком порядке выполнять операции чтения / записи / закрытия на каналах?

Я работаю над 64-битным Linux, если это имеет значение.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что все процессы p1, .. p5 потребляют весь вводимый им ввод, обрабатывают его, записывают в стандартный вывод и затем завершаются. Таким образом, следующие в конвейере процессы не должны завершаться до того, как завершатся предыдущие.

EDIT2: Я знаю, что могу также использовать

command = 'bash -c "p1 | p2 | p3 | p4 | p5"'
proc = Popen([command], shell=True)
out, err = proc.communicate(input=indata)
print out

, но мой главный интерес - узнать, как объединить конвейеры в цепочку исключительно в коде Python.

12
задан Timo 21 May 2013 в 03:09
поделиться