Как я могу заставить эти два процесса (программы) общаться друг с другом напрямую, используя каналы? - PullRequest
4 голосов
/ 09 декабря 2010

Программа A, это программа c, которая бесконечно принимает входные данные в stdin, обрабатывает их и выводит в стандартный вывод.

Я хочу написать программу B (на python), чтобы она считывала вывод A и возвращала его всем, что нужно. Обратите внимание, что должен быть только один экземпляр каждой из этих программ, поэтому с учетом b1 и b2, которые являются экземплярами b вместо:

$ b1 | a | b2

Мне нужно иметь

$ b1 | a | b1 

Ниже приведена диаграмма конечного желаемого результата:

alt text

Ответы [ 2 ]

6 голосов
/ 09 декабря 2010

Используйте класс subprocess.Popen для создания подпроцесса для программы A. Например:

import subprocess
import sys

# Create subprocess with pipes for stdin and stdout
progA = subprocess.Popen("a", stdin=subprocess.PIPE, stdout=subprocess.PIPE)

# Reassign the pipes to our stdin and stdout
sys.stdin = progA.stdout
sys.stdout = progA.stdin

Теперь эти два процесса могут общаться друг с другом через каналы. Также может быть хорошей идеей сохранить исходные sys.stdin и sys.stdout в другие переменные, чтобы, если вы когда-нибудь решите прервать подпроцесс, вы могли восстановить исходные состояния stdin и stdout (например, терминала). *

1 голос
/ 22 января 2013

Для тех, кто приходит сюда через Google: на самом деле есть очень хороший способ использования именованных каналов:

сначала создайте 2 канала имен:

mkfifo pipe1
mkfifo pipe2

затем запустите это:

echo -n x | cat - pipe1 > pipe2 & cat <pipe2 > pipe1

это заставит команды cat постоянно копировать букву x друг другу. Так что теперь вы можете свободно использовать собственные программы вместо cat для обработки ввода и вывода. Это не ограничивается питоном. Вы также можете подключить Java-программу к программе на C ++.

Например, если ваши программы называются A.py и B.py, начальная команда будет выглядеть так:

echo -n x | ./A.py - pipe1 > pipe2 & ./B.py <pipe2 > pipe1
...