2012-08-02 76 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块。