2010-12-09 34 views
4

程序A,是一个无休止的c程序,它接收stdin中的输入,处理它并将其输出到标准输出。如何让这两个进程(程序)直接使用管道相互对话?

我想写程序B(在Python中),所以它会读取A的输出,并将其反馈给任何需要的东西。 注意必须有各自的节目中只有一个实例,所以给出b1和b2这是B的实例,而不是:我需要有

$ b1 | a | b1 

以下

$ b1 | a | b2 

是图最终想要的结果的:

alt text

+1

什么是停止条件?正如你所定义的,除非你的程序写入磁盘或输出到`stderr`,否则它们将继续无限循环,直到给出像EOF或SIGINT这样的哨兵。 – MrGomez 2010-12-09 04:20:57

+1

@MrGomez,不用担心。退出可以通过stdin传递。此外,他们的意图是无止境地运行;-) – 2010-12-09 04:26:08

回答

6

使用subprocess.Popen类来创建程序A F 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

对于那些谁由谷歌来到这里:这里居然是使用命名管道一个很好的办法:

首先创建2个管:

mkfifo pipe1 
mkfifo pipe2 

然后运行这个:

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

这将导致cat命令将字母x始终相互复制。所以现在你可以随意使用自己的程序而不是猫来处理输入和输出。这不仅限于python。你也可以用java程序连接一个java程序。

例如,如果你的程序称为A.py和B.py最初的命令是:

echo -n x | ./A.py - pipe1 > pipe2 & ./B.py <pipe2 > pipe1 
相关问题