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 shell 내부에 눌려진 어떤 키에도 응답하지 않기 때문에 ... 나는 어디로 가야할지 모른다.

Jeremy Brown's answer도 도움이되었지만, select.epoll()이 (가) AttributeError 예외를 던지고있었습니다.

작동시키기위한 다른 방법이나 트릭이 있습니까? 그것은 크로스 플랫폼 일 필요는 없으며, GNU/Linux와 macOS를위한 솔루션은 대단히 감사 할 것입니다. 미리 감사드립니다!

답변

0

솔루션을 지향하는 biggest hint의 Adam Matan에게 큰 감사를드립니다. 이것은 내가 무엇을 최대 온이며, 그것은 완벽하게 작동합니다 :

  1. 그것은 다른 스레드
  2. 을 차단하지 않고 그것은 동시에
  3. 가 마지막으로 각각의 종료 코드를 기다립니다 각 인스턴스를 시작 병렬
  4. 의 각 Thread 객체를 시작합니다

    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!" 
    
    : 여기

코드입니다