我在使用重定向子模块的另一个程序的标准输入输出的问题。从标准输出结果只是阅读挂了,Popen.communicate()的作品,但它读取/写入后关闭管道。什么是实现这个最简单的方法是什么?

我玩弄在Windows操作系统上:

import subprocess
proc = subprocess.Popen('python -c "while True: print \'Hi %s!\' % raw_input()"',
                        shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT)
while True:
    proc.stdin.write('world\n')
    proc_read = proc.stdout.readline()
    if proc_read:
        print proc_read
有帮助吗?

解决方案

不适合100%的例子,但有助于了解潜在的问题:过程P开始孩子C. Child C级写东西,它的标准输出。的C stdout是具有4096字符缓冲器中的管和输出比短。现在,C等待一些输入。对于C,一切都很好。

P等待其输出永远不会到来,因为OS认为没有理由以冲洗的C(在它以如此少量的数据)输出缓冲器。由于P从未得到C的输出,它永远不会写入任何C,所以C挂起等待来自P上的输入。

修复:使用冲洗后,每写一个管道迫使OS发送数据的现在的。

在你的情况下,在主加入proc.stdin.flush() while循环,并在孩子圈后打印应该可以解决你的问题sys.stdout.flush()

您还应该考虑移动从其他过程读取到一个线程的代码。这里的想法是,你永远无法知道什么时候该数据将到达,并使用一个线程可以帮助你,而你写一个处理结果的代码了解这些问题。

在这个地方,我想向你展示新的Python 2.6文档,但它并不能解释的冲水问题,无论是:(哦...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top