Связывание двух выходов подпроцесса с входом другого подпроцесса - PullRequest
1 голос
/ 16 февраля 2012

поэтому у меня проблема здесь.У меня есть подпроцесс, который читает один файл и перенаправляет вывод в канал подпроцесса.У меня есть другой подпроцесс, который делает то же самое.Я хочу выполнить команду diff для каждого из этих выходов.Возможно использование другого подпроцесса, но каким-то образом чтение в обоих стандартных выводах из двух других.Вот пример.

proc1 = subprocess.Popen(['samtools', 'view', 'file1'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['samtools', 'view', 'file2'], stdout=subprocess.PIPE)

И теоретически это то, что я хочу сделать ...

proc3 = subprocess.Popen(['diff', proc1.communicate()[0], proc2.communicate()[0]], stdout=subprocess.PIPE)

Если кто-то не понимает, что я имею в виду, я могу объяснить лучше, но, надеюсь,если вы знаете что-нибудь о подпроцессах, вы получите это.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012
import os
from subprocess import Popen, PIPE

outside, inside = os.pipe()

one = Popen(['/path/to/one'], stdout = inside)
two = Popen(['/path/to/two'], stdout = inside)

merge = Popen(['/path/to/merge'], stdin = outside)

Эта функция не выполняет различий на выходах.Он просто направляет обе программы на вход процесса слияния.

Считывание различий между двумя входами, направленными в один канал, будет невозможно.

0 голосов
/ 16 февраля 2012

Я бы сказал, что хорошим способом добиться этого было бы перенаправить вывод двух начальных процессов на два разных именованных канала и использовать их в качестве файлов в третьем процессе для получения ввода.

...