2017-03-14 8 views
0

未知数のコマンドを実行して、stdoutをファイルに取り込もうとしています。しかし、各インスタンスでp.wait()を試してみると難しいです。複数のsubproccess.Popenコマンドを同時に待機()してから終了します。

print "Started..." 
for i, cmd in enumerate(commands): 
    i = "output_%d.log" % i 
    p = Popen(cmd, shell=True, universal_newlines=True, stdout=open(i, 'w')) 
    p.wait() 
print "Done!" 

私は現在のスクリプトそれぞれ、すべての単一のプロセスが完了しているだけを同時にcommandsですべてを実行し、終了する方法を探しています:私のコードは次のようになります。また、各コマンドが終了コードを返すときに通知されるのに役立ちます。

私はJFセバスチャンによってthis oneを含め、いくつかの答えを見て、args=(p.returncode, q)からargs=(p.stdout, q)を変更することで、私の状況に適合するようにしようとしたが、それのように、すぐに終了し、(おそらくshell=Trueに?)、バックグラウンドで実行されている終わってきましたよくbashシェルの中に押し込まれたキーに応答しない...私はこれとどこに行くべきかわからない。

Jeremy Brown's answerも手伝っていただきましたが、select.epoll()がAttributeError例外をスローしていました。

他のシームレスな方法や仕組みがありますか?それはクロスプラットフォームである必要はありません、GNU/LinuxとmacOSのための解決策は大いに感謝されるでしょう。前もって感謝します!

答えて

0

解決策に向けてbiggest hintのAdam Matanに大きなおかげです。これは私が思い付いたものです、そして、それは完璧に動作します:

  1. それはパラレル
  2. に各Threadオブジェクトを開始それは最後に、それは他のスレッド
  3. を遮断することなく、各終了コードを待ち
  4. 同時に各インスタンスを起動しますここで

はコードです:

import threading 
import subprocess 

... 

def run(cmd): 
    name = cmd.split()[0] 
    out = open("%s_log.txt" % name, 'w') 
    err = open('/dev/null', 'w') 
    p = subprocess.Popen(cmd.split(), stdout=out, stderr=err) 
    p.wait() 
    print name + " completed, return code: " + str(p.returncode) 

... 

proc = [threading.Thread(target=run, args=(cmd)) for cmd in commands] 
[p.start() for p in proc] 
[p.join() for p in proc] 
print "Done!" 
関連する問題