Question

Je l'ai utilisé comme référence, mais pas en mesure d'accomplir exactement ce que j'ai besoin: appel d'une commande externe en Python

J'ai aussi été en train de lire ceci: http://www.python.org/ dev / EPEP / pep-3145 /

Pour notre projet, nous avons 5 svn checkouts qui ont besoin de mettre à jour avant de pouvoir déployer notre application. Dans mon environnement de développement, où les déploiements rapides sont un peu plus important pour la productivité d'un déploiement de production, je travaille à accélérer le processus.

J'ai un script bash qui travaille décemment, mais a des limites. Je lance plusieurs « svn mises à jour » avec la commande bash suivante:

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

Ces fonctionnent tous en parallèle et cela fonctionne assez bien. Je l'utilise aussi ce modèle dans le reste du script de compilation pour la cuisson de chaque génération de fourmis, se déplaçant alors les guerres Tomcat.

Cependant, je ne contrôle pas arrêter le déploiement si l'une des mises à jour ou une compilation échoue.

Je suis re-écrire mon script bash avec Python et j'ai donc plus de contrôle sur les branches et le processus de déploiement.

J'utilise subprocess.call () pour déclencher la « mise à jour / repo svn » commandes, mais chacun agit séquentiellement. J'essaie « (svn mise à jour / repo) et » et les tout feu éteint, mais le code de résultat retourne immédiatement. J'ai donc aucun moyen de déterminer si une commande particulière échoue ou non en mode asynchrone.

import subprocess

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

J'aimerais trouver un moyen d'avoir le feu Python de chaque commande Unix, et le cas échéant des appels échoue à tout moment l'arrêt du script entier.

Était-ce utile?

La solution

Ne pas utiliser shell=True. Il needlessy invoquer le shell pour appeler votre programme svn, et qui vous donnera le code de retour du shell au lieu de celui de 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'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top