0

サブプロセスを使用してスクリプトを実行し、パイプでスクリプトの出力を取得し、出力で処理します。

スクリプトの最後まで読み取られる場合と、最後まで読み取れない場合があるという奇妙な問題が発生します。

これはバッファサイズの問題である可能性があると思います..いくつかの代替案を試しましたが、まだ成功していません..

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

stdoutが終了するまでではなく、プロセスが終了するまでstdoutからの読み取りを試行し続ける必要があります。また、poll()を使用してプロセスが終了したかどうかを確認し、終了していない場合は、再度読み取りを試みてください。

于 2012-07-05T18:39:01.250 に答える
2

サブプロセスマニュアルから:[ http://docs.python.org/library/subprocess.html ]

警告.stdin.write、.stdout.read、または.stderr.readではなくcommunicate()を使用して、他のOSパイプバッファがいっぱいになり子プロセスをブロックすることによるデッドロックを回避します。

これは、発生している問題の可能性があるようです。たとえば、stderrがいっぱいになると、プロセスがブロックされ、stdoutでそれ以上の出力が生成されなくなる可能性があると思います。

于 2012-07-05T22:14:08.453 に答える