如何让这两个进程(程序)直接使用管道相互通信?

时间:2010-12-09 04:12:39

标签: python pipe stdout stdin stdio

程序A,是一个无休止的程序,在stdin中接收输入,处理它并将其输出到stdout。

我想编写程序B(在python中),因此它将读取A的输出,并将其反馈给任何需要的东西。 注意,每个程序必须只有一个实例,所以给定b1和b2是b的实例而不是:

$ b1 | a | b2

我需要

$ b1 | a | b1 

以下是最终预期结果的图表:

alt text

2 个答案:

答案 0 :(得分:6)

使用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.stdinsys.stdout保存到其他变量中也是一个好主意,这样如果您决定终止子进程,则可以将stdin和stdout恢复到其原始状态(例如终端) )。

答案 1 :(得分:1)

对于那些来到谷歌的人来说:实际上有一种使用命名管道的好方法:

首先创建2个名称管道:

mkfifo pipe1
mkfifo pipe2

然后运行:

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

这将导致cat命令始终将字母x复制到彼此。因此,现在您可以随意使用自己的程序而不是cat来处理输入和输出。这不仅限于python。您还可以将java程序与c ++程序连接起来。

例如,如果您的程序名为A.py和B.py,则初始命令为:

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