0

我正在使用 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()
4

2 回答 2

2

来自子流程手册:[ http://docs.python.org/library/subprocess.html ]

警告使用communicate() 而不是.stdin.write、.stdout.read 或.stderr.read 以避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。

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

于 2012-07-05T22:14:08.453 回答
2

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

于 2012-07-05T18:39:01.250 回答