2012-08-02 109 views
0

這是想法。我將有'main'python腳本,它將啓動(使用子流程)app1和app2。 'main'腳本會將輸入發送到app1並將結果輸出到app2,反之亦然(主腳本需要記住發送的內容,因此我無法將管道從app1發送到app2)。Python與其他應用程序使用子進程交談

這是主要腳本。

import subprocess 
import time 

def main(): 
    prvi = subprocess.Popen(['python', 'random1.py'], stdin = subprocess.PIPE , stdout = subprocess.PIPE, stderr = subprocess.STDOUT) 

    while 1: 
     prvi.stdin.write('131231\n') 
     time.sleep(1) # maybe it needs to wait 
     print "procitano", prvi.stdout.read() 

if __name__ == '__main__': 
    main() 

這是'random1.py'文件。

import random 

def main(): 
    while 1: 
     inp = raw_input() 
     print inp, random.random() 
if __name__ == '__main__': 
    main() 

首先我試過只用一個子進程來看它是否工作。事實並非如此。它只輸出'procitano'並在那裏等待。 如何從'prvi'中讀取輸出(沒有溝通()。當我使用它時,它退出我的應用程序,這是我不想要的東西)?

回答

2

prvi.stdin.write(...)之後加prvi.stdin.flush()

說明:爲了優化進程之間的通信,操作系統會在將整個緩衝區發送到其他進程之前緩衝4KB數據。如果發送較少的數據,你需要告訴OS「就是它把它現在。」 - >flush()

[編輯]接下來的問題是,prvi.stdout.read()永遠不會返回,因爲孩子不退出。

您將需要在進程之間開發一個協議,以便每個知道獲取數據時要讀取的數據字節數。一個簡單的解決方案是使用基於行的協議(每個「消息」由一個新行終止)。要做到這一點,替代read()readline(),不要忘記追加\n一切您發送+ flush()

+0

除了仍然阻止:)) – 2012-08-02 09:17:49

+0

謝謝你的答案先生,但我已經嘗試過,我現在也試過,看看它是否工作。不幸的是,它不是。 – Vizualni 2012-08-02 09:22:01

+0

由於你不給我任何信息什麼不工作,我不能幫你。 – 2012-08-02 09:29:50

1

main.py

import subprocess 
import time 

def main(): 
    prvi = subprocess.Popen(['python', 'random1.py'], stdin = subprocess.PIPE , stdout = subprocess.PIPE, stderr = subprocess.STDOUT) 


    prvi.stdin.write('131231\n') 
    time.sleep(1) # maybe it needs to wait 
    print "procitano", prvi.stdout.read() 

if __name__ == '__main__': 
    main() 

random1.py

import random 

def main(): 

    inp = raw_input() 
    print inp, random.random() 
    inp = raw_input() 

if __name__ == '__main__': 
    main() 

我已經用上面的代碼進行了測試,然後我的代碼也遇到了同樣的問題。 我認爲問題在於時機。 這裏是我的猜測, 當main.py嘗試以下

prvi.stdout.read() # i think this code may use the random1.py process 

下面的代碼搶碼random1.py過程

inp = raw_input() 

爲了解決這個問題,我認爲,亞倫Digulla說,你需要開發協議來實現它。

1
  • 使用-u標誌以使random1.py輸出緩衝
  • 使用p.stdout.readline()而不是.read()

time.sleep是不必要由於.read塊。