2010-03-23 13 views
10

나는 참고로이를 사용하지만, 내가 필요 정확히 무엇을 달성 할 수되지 않은 : 나는이 읽고 있던 Calling an external command in Python파이썬의 비동기 백그라운드 프로세스?

: 우리의 프로젝트에 대한 http://www.python.org/dev/peps/pep-3145/

을, 우리는 업데이트해야 할 5 개 svn의 체크 아웃을해야 우리는 애플리케이션을 배포 할 수 있습니다. 빠른 배포가 생산 배포보다 생산성 측면에서 더 중요한 내 개발 환경에서는 프로세스 속도를 높이기 위해 노력해 왔습니다.

나는 제대로 작동하지만 몇 가지 제한이있는 bash 스크립트가 있습니다. 나는 다음과 같은 bash는 명령 '업데이트 SVN'복수를 불 :

(svn update /repo1) & (svn update /repo2) & (svn update /repo3) & 

병렬이 모두 실행하고 꽤 잘 작동합니다. 또한 나머지 개작 스크립트에서이 패턴을 사용하여 각 개미 빌드를 실행 한 다음 전쟁을 Tomcat으로 옮깁니다.

그러나 업데이트 나 빌드 중 하나가 실패하면 배포를 중지 할 수 없습니다.

필자는 bash 스크립트를 파이썬으로 다시 작성하므로 브랜치와 배포 프로세스를보다 잘 제어 할 수있다.

'svn update/repo'명령을 실행하기 위해 subprocess.call()을 사용하고 있지만, 각각은 순차적으로 작동합니다. 나는 (svn update/repo) & '을 시도하고 그 모두가 실행되지만 결과 코드는 즉시 반환됩니다. 따라서 비동기 모드에서 특정 명령이 실패했는지 여부를 판단 할 방법이 없습니다.

import subprocess 

subprocess.call('svn update /repo1', shell=True) 
subprocess.call('svn update /repo2', shell=True) 
subprocess.call('svn update /repo3', shell=True) 

나는 각 유닉스 명령어 오프 파이썬 불을 가지고하는 방법을 찾아야 싶지만, 그리고 통화의 전체 스크립트가 중지 언제든지 실패 할 경우.

답변

18

shell=True을 사용하지 마십시오. 불필요하게 쉘을 호출하여 svn 프로그램을 호출하면 svn 대신 쉘의 리턴 코드를 얻을 수 있습니다.

repos = ['/repo1', '/repo2', '/repo3'] 
# launch 3 async calls: 
procs = [subprocess.Popen(['svn', 'update', repo]) for repo in repos] 
# wait. 
for proc in procs: 
    proc.wait() 
# check for results: 
if any(proc.returncode != 0 for proc in procs): 
    print 'Something failed' 
+2

그건 내가 찾고있는 것입니다. – Geuis

+1

감사합니다. 작동합니다. 백그라운드에서 하위 프로세스를 실행할 수있는 방법이 있습니까? 이제 터미널에 표시됩니까? (현재 나는 작업 명령으로 열린 셸을 본다) –

관련 문제