web-dev-qa-db-ja.com

Python subprocess.Popen()完了を待つ

ディレクトリを順番に調べて、その中のサブディレクトリでコマンドを実行する小さなスクリプトを書いています。

しかし、 Popen() で問題に直面しています。ディレクトリをたどって、前のコマンドが完了するのを待たずに目的のコマンドを実行します。つまり.

for dir in dirs:
    #run command on the directory here.

後で気にせずに各ディレクトリのコマンドを開始します。現在のものが終了するのを待ってから、次のものを開始するようにします。ディレクトリで使用しているツールはLog2timeline SANS SIFTから。かなり時間がかかり、かなりの出力を生成します。出力は気にしません。次のプログラムを開始する前にプログラムを待機させたいだけです。

これを達成する最良の方法は何ですか?

ありがとうございました!

12
DJMcCarthy12

Popen.wait を使用します。

process = subprocess.Popen(["your_cmd"]...)
process.wait()

または、 check_outputcheck_call これらはすべて、実行する処理とPythonのバージョンに応じて、リターンコードを待ちます。

python> = 2.7を使用していて、出力を気にしない場合は、単にcheck_call

また、 call を使用することもできますが、ゼロ以外の戻りコードがあり、望ましい場合もそうでない場合も、エラーは発生しません。

32
subprocess.check_output( ... )

ブロックします...そしてPopenの代わりに使用できます

ただし、Popenに設定されている場合

subprocess.Popen(...).communicate() 

プロセスが戻るまでブロックします

7
Joran Beasley