2010-03-23 25 views
10

Sto usando questo come un punto di riferimento, ma non in grado di realizzare esattamente quello che mi serve: Calling an external command in PythonProcessi in background asincroni in Python?

anche io stavo leggendo questo: http://www.python.org/dev/peps/pep-3145/

Per il nostro progetto, abbiamo 5 checkout svn che hanno bisogno di aggiornare prima che possiamo implementare la nostra applicazione. Nel mio ambiente di sviluppo, dove le implementazioni veloci sono un po 'più importanti per la produttività rispetto a una distribuzione di produzione, ho lavorato per accelerare il processo.

Ho uno script di bash che ha funzionato correttamente ma presenta alcune limitazioni. Apro il multiplo 'svn aggiornamenti' con il seguente comando bash:

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

Questi tutti corrono in parallelo e funziona piuttosto bene. Uso questo pattern anche nel resto dello script di build per sparare ogni build di formiche, quindi spostare le guerre su Tomcat.

Tuttavia, non ho alcun controllo sull'arresto della distribuzione se uno degli aggiornamenti o una compilazione falliscono.

Sto riscrivendo il mio script di bash con Python in modo da avere più controllo sulle filiali e sul processo di distribuzione.

Sto usando subprocess.call() per attivare i comandi "svn update/repo", ma ognuno di essi agisce in sequenza. Provo '(svn update/repo) &' e tutti si spengono, ma il codice risultato ritorna immediatamente. Quindi non ho modo di determinare se un particolare comando fallisce o meno nella modalità asincrona.

import subprocess 

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

Mi piacerebbe trovare un modo per avere Python fuoco fuori di ogni comando Unix, e se una qualsiasi delle chiamate viene a mancare in qualsiasi momento l'intero script si ferma.

risposta

18

Non utilizzare shell=True. Non sarà necessario richiamare la shell per chiamare il tuo programma svn, e questo ti darà il codice di ritorno della shell invece di 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

Questo è proprio quello che stavo cercando. – Geuis

+1

Grazie, funziona. Esiste un modo per eseguire il sottoprocesso in background - ora visualizzato nel terminale? (attualmente vedo shell aperta con comando di lavoro) –

Problemi correlati