2016-04-29 6 views
1

私はスクリプトを持っている場合、そのスケジュール時々並列に実行することができます別のプログラム(すなわち、私は複数回以下の機能を呼び出すことができます)のロングランを。私は火、これらの子供たちを忘れるしたいと思いますので、私は現在持っている:Pythonのサブプロセス読み取り標準出力/標準エラー出力<10秒でプログラムがクラッシュし

p = subprocess.Popen(cmd, shell=False) 
time.sleep(20) 
result = p.poll() 
if result is not None and result != 0: 
    print("Child failed to start with exit code: {}".format(result)) 
    return False 
return True 

これは、ほとんどの部分に適していますが、私は子供のためにだけ、それが失敗した場合に標準出力/標準エラー出力を取得したいと思い10秒以上実行する。私はちょうどサブプロセスオブジェクトを無視した場合、バッファがいっぱいになると、子プロセスがハングすることを意味しますPopen(..., stdout=PIPE)を使用して私の理解から

。それは文句を言わないハングアップするよう

は、どのように私はこの問題を解決することができます。どういうわけか、PIPEをNoneに交換することは可能ですか?

p = subprocess.Popen(cmd, shell=False, stdout=PIPE, stderr=PIPE) 
time.sleep(20) 
result = p.poll() 
if result is not None and result != 0: 
    print("Child failed to start with exit code: {}".format(result)) 
    stdout, stderr = p.communicate() 
    print("STDOUT:", stdout) 
    print("STDERR:", stderr) 
    return False 
return True 

また、最初の10秒間に生成される出力をバッファに保持することも簡単にできます。

答えて

1

簡単な方法は、すべての子どもたちが一時ファイル(https://docs.python.org/2/library/tempfile.html)への書き込み持つことであろう。ただ、そこの代わりに、パイプに書き込み、および(クラッシュがある場合)にのみ、必要に応じてファイルを読み込みます。

関連する問題