2013-05-16 54 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