2013-08-27 1 views
0

기본적으로 스크립트를 사용하여 다른 디렉토리에서 다른 스크립트를 시작하고 모든 "하위 스크립트"가 완료 될 때까지 후속 작업을 수행하려고합니다. 나는 다중 처리를 사용한다. 모든 자식 프로세스를 함께 넣고 wait()를 사용하여 모두 완료 될 때까지 기다린다.python 스크립트를 사용하여 다른 python 스크립트를 시작하고 "자식 스크립트"가 모두 완료되었는지 확인하는 방법?

import os, shutil, subprocess,sys, multiprocessing 

rootdir=os.getcwd() 
argument=[] 
def Openpy(inputinfo): 
    dirpath, filename= inputinfo 
    os.chdir(dirpath) 
    return subprocess.Popen([ 'python', filename ]) 

if __name__=="__main__": 
    for dirpath, dirname , filenames in os.walk(rootdir): 
     for filename in filenames: 
      if filename=='Test.py': 
       argument.append([ dirpath, filename ]) 
    print argument 
    po=multiprocessing.Pool() 
    r=po.map_async(Openpy, argument) 
    po.close() 
    r.wait() 

print 'Child scripts are finished' 

자식 프로세스가 1 분 정상적으로 시작과 마무리 : 여기 내 스크립트입니다. 그러나 이러한 자식 프로세스는 "완료된 메시지"를 부모 프로세스로 반환하지 않는 것으로 보입니다. 그것은 "어린이 스크립트가 끝났다"는 것을 보여주지 않았습니다. 자식 프로세스의 끝을 제대로 감지 할 수 있도록 내 코드를 변경하려면 어떻게해야합니까?

모든 도움을 주실 수 있습니다!

2013년 9월 1일 세계 협정시 09시 16분 + 8

J.F. 세바스찬의 답변이 접수되고있다. 목록 이해력을 성공적으로 잘 사용하면 전체 내용을 더 쉽게 읽을 수 있습니다. r.wait()와 po.close의 위치를 ​​(교환

+0

들여 쓰기 참조? 마지막 줄도 '탭'으로 들여 쓰기해야한다고 생각합니다. – pwagner

답변

0

Popen() 즉시 반환되므로 부모 프로세스는 자녀가 스크립트를 작성하기 훨씬 전에 완료됩니다. 즉, 출력의 맨 처음에 "완료된 메시지"를 찾으십시오.

당신은 동시에 서브 프로세스를 실행하는 데 multiprocessing 필요하지 않습니다 :

import os 
import sys 
from subprocess import Popen 

# run all child scripts in parallel 
processes = [Popen([sys.executable, filename], cwd=dirpath) 
      for dirpath, dirname , filenames in os.walk('.') 
      for filename in filenames 
      if filename == 'Test.py'] 

# wait until they finish 
for p in processes: 
    p.wait() 
print("all done") 

Python threading multiple bash subprocesses?

+0

당신의 방법이 효과적입니다. 하지만'Popen'이 내 멀티 코어 CPU를 활용할 수 있습니까? Btw,'from subprocess import Popen'이 추가되어야합니다. –

+0

@ user2720402 : 예,'Popen'은 여러 개의 CPU를 사용할 수 있습니다 (각 호출은 별도의 프로세스를 생성합니다). – jfs

+0

고마워요! 질문이 하나 더 있지만 주제와는 조금 관련이 없습니다. 모듈'threading.thread'만이 여러 프로세스를 호출 할 때 다중 코어 CPU를 사용할 수 없습니까? –

0

TRY)

if __name__=="__main__": 
    for dirpath, dirname , filenames in os.walk(rootdir): 
     for filename in filenames: 
      if filename=='Test.py': 
       argument.append([ dirpath, filename ]) 
    print argument 
    po=multiprocessing.Pool() 
    r=po.map_async(Openpy, argument) 
    r.wait() 
    po.close() 

그것은 당신의 문제가되지 않을 수도 있지만, 결과가 평가되기 전에 아마 당신이 풀을 닫는 것 같습니다.

+0

코드를 테스트했지만 하위 프로세스의 '최종 프로세스'응답이 없습니다. –

관련 문제