2010-07-16 80 views
1

我试图让两个进程使用管道进行通信。 我这样做是在父进程:通过管道使python程序“聊天”

process = subprocess.Popen(test, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

process.stdin.write("4\n"); 
output = process.stdout.read() 
print output 

,并在子进程:

inp = raw_input() 
integer = int(inp) 
print integer**2 
while(True): 
    pass 

我希望父进程打印16 ......不幸的是,它仍然悬而不打印任何东西。用5秒的休眠时间代替无限循环使父进程空闲5秒,并在该打印16之后空闲。 这表明父进程在其终止执行后仅从子进程获得输出。

我想知道在程序结束之前是否有可能获得输入。 我的想法是通过此管道传递信息,获取输入,处理它并将结果输出到管道中,以便其他人可以继续处理。

任何帮助? 谢谢,

曼努埃尔

+3

你试过刷新流时,你写的' “4 \ n” '? – 2010-07-16 20:00:25

+0

是的,那不是问题。子进程实际上得到了4,我看到它,因为在阅读完输入后,我将它写入常规文件,然后进入无限循环。父进程是在read()部分中阻塞的进程。 – 2010-07-16 20:20:36

+0

出于好奇,为什么不在子进程中使用'sys.stdin.readline()'? – 2010-07-16 20:34:27

回答

2

至于建议的ndim,做父如下因素:

process.stdin.write("4\n")  
process.stdin.flush()  
output = process.stdout.readline()  
print output 

您还需要改变孩子:

inp = sys.stdin.readline() 
integer = int(inp) 
sys.stdout.write("%d\n", (integer ** 2,)) 
sys.stdout.flush() 

我用sys.stdin.readlinesys.stdout.write作为一个风格问题。

我写2 test programs,他们在Fedora 13中工作正常使用python-2.6.4-27

+0

这不能解决问题,但感谢您的帮助和建议! – 2010-07-16 21:08:57

+0

@曼纽尔:你有没有尝试新的方案? – 2010-08-04 16:56:28

+0

我已经解决了它,但以一种非常丑陋的方式。您的解决方案非常简单,非常干净!非常感谢。 (你会得到解决方案标记,因为我会更新我的代码到这个...) – 2010-08-05 04:51:08

4

我看到一些可能的问题:

一)的子进程实际上从未刷新它的输出,因此从来没有真正把它传送给家长。

b)父进程在子进程实际发送其输出之前运行它的read()调用(刷新其输出)。

c)父进程阻塞read(),直到EOF这实际上意味着它等待孩子退出。 subprocess.Popen文档应该提到这是否可以。

d)父进程的read()调用在返回之前等待一定数量的字节(例如1024)到达。

可能让父母做大量的read(1)调用,并在进入时重新组合字节将解决问题。或者使用更高级别的通信API,例如使用数据报而不是解析字节流。