程序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