8

次のコマンドを使用してシェル コマンドを実行しています (サブプロセスを作成しています)。

cmd = "ls"
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)

次に、終了時にリターンコードを取得したいと思います。またはを使用する必要がありますwait()poll()?私には忙しい待機に囲まれているにwait()等しいようです。poll()何かのようなもの:

while process.poll() == None:
    time.sleep(0.5)

バッファがいっぱいになるとwait()デッドロックが発生する可能性があることを読みました。上記のように使用すると、デッドロックが発生する可能性がありますか? これが本当なら、問題を解決するために使用する必要がありますか? 最近 は subprocess に興味があるときだけ使っています。stdout/stderrprocess.poll()process.comunicate()process.comunicate()stdout/stderr

前もって感謝します。

4

1 に答える 1

4

はい。subprocess.poll、そのようなループで使用されると、がstdoutプロセスにパイプされていて、そこから読み取っていない場合、デッドロックが発生します。パイプを使用しないstdoutか、一貫して読み取りを行っている場合は、デッドロックpollも発生しません。デッドロックが発生する場合に解決します。ただし、コマンドを実行してそのリターン コードを確認し、その出力を取得するだけの場合は、そのすべてをラップする を使用します。waitsubprocess.communicatesubprocess.check_output

于 2012-12-12T04:25:34.487 に答える