2016-07-07 19 views
0

proc.terminate()を呼び出した後でも、proc.communicate()の呼び出しがハングするという問題が発生しています。終了後にPythonサブプロセスの通信が失敗する

私は、スクリプトが完了した時点でコール

import subprocess as sub 
p = sub.Popen(command, stdout=sub.PIPE, stderr=sub.PIPE, shell=False) 

にバックグラウンドで実行されるタスクを作成して、私はプロセスから情報を収集するためにterminate()communicate()、およびwait()を呼び出します。

p.terminate() 
errorcode = p.wait() 
(pout, perr) = p.communicate() 

通信の呼び出し時にスクリプトがハングします。私は、終了するための呼び出しに続く通信の呼び出しはすぐに戻ると仮定しました。これが失敗する理由はありますか?

編集:私はこのコマンドを使用しています。これは、コマンドが実際には単独で終了しないタイトループであるためです。私はそれを行うためにp.terminate()を使いたいと思って、stdoutとstderrが提供しなければならないものを見てください。

+3

もちろん、終了したばかりですが、なぜコミュニケーションを呼び出さないのですか? –

+0

'p.wait()'が返りますが、 'p.communicate()'が "ハングする"場合は、[Pythonのサブプロセス.check_callと.check_output](http://stackoverflow.com/q/36169571/4279) )( 'check_call()'は内部的に '.wait()'を呼び出し、 'check_output()'は '.communicate()'を内部的に呼び出します)。無関係: 'p.wait()'を明示的に呼び出す必要はありません。 'p.wait()'は内部的に呼び出されるため、 'p.communicate()'が返ってから 'p.returncode'を使うことができます。一般に、 'p.pnmunicate()'の前に 'p.wait()'を呼び出すのは悪い習慣です。ライブプロセスをデッドロックする可能性があります(この場合は適用されません。 – jfs

+0

@PadraicCunningham:そう簡単ではありません。たとえば、子プロセスが明示的に終了するまで終了しない場合などです。もう一つのケース:もし子プロセスがそれ自身の子を生成することができれば、 'p.communicate()'は遅れるかもしれません。 [リンクされた質問](http://stackoverflow.com/q/36169571/4279)に私の答えを読んでください。 – jfs

答えて

1

最初の2つのステートメントは必要ありません。ちょうどcommunicate()に電話してください。

関連する問題