程序A,是一个无休止的c程序,它接收stdin中的输入,处理它并将其输出到标准输出。如何让这两个进程(程序)直接使用管道相互对话?
我想写程序B(在Python中),所以它会读取A的输出,并将其反馈给任何需要的东西。 注意必须有各自的节目中只有一个实例,所以给出b1和b2这是B的实例,而不是:我需要有
$ b1 | a | b1
以下
$ b1 | a | b2
是图最终想要的结果的:
程序A,是一个无休止的c程序,它接收stdin中的输入,处理它并将其输出到标准输出。如何让这两个进程(程序)直接使用管道相互对话?
我想写程序B(在Python中),所以它会读取A的输出,并将其反馈给任何需要的东西。 注意必须有各自的节目中只有一个实例,所以给出b1和b2这是B的实例,而不是:我需要有
$ b1 | a | b1
以下
$ b1 | a | b2
是图最终想要的结果的:
使用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.stdin
和sys.stdout
保存为其他变量也是一个好主意,因此如果您决定终止子进程,则可以将stdin和stdout恢复到其原始状态(例如终端)。
对于那些谁由谷歌来到这里:这里居然是使用命名管道一个很好的办法:
首先创建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
什么是停止条件?正如你所定义的,除非你的程序写入磁盘或输出到`stderr`,否则它们将继续无限循环,直到给出像EOF或SIGINT这样的哨兵。 – MrGomez 2010-12-09 04:20:57
@MrGomez,不用担心。退出可以通过stdin传递。此外,他们的意图是无止境地运行;-) – 2010-12-09 04:26:08