我正在使用子进程来运行脚本,在管道上获取脚本的输出并处理输出。
我遇到了一个奇怪的问题,有时它会一直读到脚本结束,而另一些时间它不会一直持续到最后。
我怀疑这可能是缓冲区大小的问题..尝试了一些替代方案但尚未成功..
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()
答案 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上产生进一步的输出。