2013-05-16 69 views
2

我有一個簡單echoprocess.py:與子溝通,而無需等待子進程終止窗口

import sys 

while True: 
    data = sys.stdin.read() 
    sys.stdout.write("Here is the data: " + str(data)) 

而一個parentprocess.py

from subprocess import Popen, PIPE 

proc = Popen(["C:/python27/python.exe", "echoprocess.py"], 
      stdin = PIPE, 
      sdtout = PIPE) 

proc.stdin.write("hello") 
print proc.stdout.read() 

這只是掛起,直到echoprocess.py是終止。我想多次與這個子進程通信,而不必重新啓動它。這種進程間通信是否可以與Windows上的Python子進程模塊進行通信?

+0

剛剛添加了關於輸出緩衝的註釋到我的答案。不確定Windows,但在Linux上'echoprocess.py'中的一個是必要的,儘管'parentprocess.py'中的那個不是。通常最安全的是將其包含在內以實現最大的便攜性。 – Aya

+0

也許值得看看['multiprocessing'](http://docs.python.org/2/library/multiprocessing.html)模塊,它爲這種進程間通信提供了一個抽象層。 – Aya

+0

這就是我最初做的,但是我在Windows上遇到了一些初始問題。將所有代碼放在'if __name__ =='__main __「:'塊中的Windows要求似乎需要我已經有的太多工作。 –

回答

3

的主要問題是與線...

print proc.stdout.read() 

不帶參數用於將讀取的所有數據,直至EOF,直到終止子,這將不會發生時read()方法。

你可能會好起來的與行由行閱讀,因此,您可以使用...

proc.stdin.write("hello\n") 
print proc.stdout.readline() 

...否則你就必須制定出界定「消息其他一些手段」。

你必須作出類似的變化echoprocess.py,即改變...

data = sys.stdin.read() 

...到...

data = sys.stdin.readline() 

您還可能有輸出緩衝問題,因此寫完後可能需要到緩衝區flush()


把所有這些組合起來,如果你改變echoprocess.py到...

import sys 

while True: 
    data = sys.stdin.readline() 
    sys.stdout.write("Here is the data: " + str(data)) 
    sys.stdout.flush() 

...和parentprocess.py到...

from subprocess import Popen, PIPE 

proc = Popen(["C:/python27/python.exe", "echoprocess.py"], 
      stdin = PIPE, 
      stdout = PIPE) 

proc.stdin.write("hello\n") 
proc.stdin.flush() 
print proc.stdout.readline() 

...它應該工作你期待的方式。

+0

按預期工作。沖洗的功能是什麼? –

+1

@MichaelDavidWatson那麼,爲了提高效率,進程通常會有一個內部緩衝區,調用'write()'實際上會存儲在緩衝區中,直到它達到一定的大小,此時它將被傳遞到管道進程。調用flush()會強制立即發生,而不是等待緩衝區被填充。在某個地方可能有更好的網頁描述。 – Aya