0

这就是想法。我将拥有将启动(使用子进程)app1 和 app2 的“主”python 脚本。'main' 脚本会将输入发送到 app1 并将结果输出到 app2,反之亦然(主脚本需要记住发送的内容,因此我无法将管道从 app1 发送到 app2)。

这是主脚本。

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”的输出(没有通信()。当我使用它时,它会退出我的应用程序,这是我不想要的)?

4

3 回答 3

2

prvi.stdin.flush()之后添加prvi.stdin.write(...)

说明:为了优化进程之间的通信,操作系统会在将整个缓冲区发送到另一个进程之前缓冲 4KB 的数据。如果您发送的数据较少,则需要告诉操作系统“就是这样。现在发送”->flush()

[编辑]下一个问题是prvi.stdout.read()永远不会回来,因为孩子没有退出。

您将需要在进程之间开发一个协议,以便每个进程都知道在获取某些内容时要读取多少字节的数据。一个简单的解决方案是使用基于行的协议(每个“消息”都由一个新行终止)。为此,请替换read()readline()并且不要忘记附加\n到您发送的所有内容 +flush()

于 2012-08-02T09:15:45.490 回答
1

主文件

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()

随机1.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()

为了解决这个问题,我认为,正如 Aaron Digulla 所说,你需要开发协议来实现它。

于 2012-08-04T09:17:19.230 回答
1
  • 使用-u标志使 random1.py 输出无缓冲
  • 使用 p.stdout.readline() 而不是 .read()

由于 .read 块,time.sleep 是不必要的。

于 2012-08-04T10:56:37.783 回答