2010-12-09 58 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 
相關問題