从Popen文件对象中完全读取内容

时间:2012-07-05 17:27:09

标签: python subprocess

我正在使用子进程来运行脚本,在管道上获取脚本的输出并处理输出。

我遇到了一个奇怪的问题,有时它会一直读到脚本结束,而另一些时间它不会一直持续到最后。

我怀疑这可能是缓冲区大小的问题..尝试了一些替代方案但尚未成功..

def main():
    x = subprocess.Popen('./autotest', bufsize = 1, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, cwd = '/home/vijay/run/bin', shell = True)
    with open("out.txt",'wb') as f:
        for line in x.stdout:
            if 'Press \'q\' to quit scheduler' in line:
                print line.strip()
                f.write(line.strip())
                x.stdin.write('q')
                f.write('\n')
                x.stdin.close()
                x.stdout.flush()
                try:
                    x.stdout.read()
                except:
                    print 'Exception Occured !!!'
                    os._exit(1)
            else:
                print line.strip()
                f.write(line.strip())
                f.write('\n')
                x.stdout.flush()
if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:2)

您应该继续尝试从stdout读取,直到进程终止直到stdout结束,使用poll()检查进程是否终止,如果没有,请尝试再次阅读。

答案 1 :(得分:2)

从Subprocess手册: [http://docs.python.org/library/subprocess.html]

  

警告使用communic()而不是.stdin.write,.stdout.read或   .stderr.read以避免由于任何其他OS管道导致的死锁   缓冲填充和阻止子进程。

听起来这可能是您遇到的问题。例如,如果stderr填满,我认为这可能导致进程阻塞,阻止它在stdout上产生进一步的输出。