2010-10-27 7 views
1

J'essaye d'automatiser un certain traitement de gros fichier de données en utilisant python.confus au sujet de sous-processus python à l'intérieur pour la boucle

Un Lop du traitement est enchaînée, i.e. script1 écrit un fichier, qui est ensuite traité par SCRIPT2, alors la sortie de SCRIPT2 par Script3 etc.

J'utilise le module de sous-processus dans un contexte fileté.

J'ai une classe qui crée des tuples de scripts chaînés ("scr1.sh", "scr2.sh", "scr3.sh").

Puis une autre classe qui utilise un appel comme

for script in scriplist: 
    subprocess.call(script) 

Ma question est que dans cette boucle, est chaque script appelé uniquement après subprocess.call (script1) retourne un succès retcode ?.

Ou est-ce que tous les trois sont appelés les uns après les autres depuis que j'utilise subprocess.call, Sans utiliser "sleep" ou "wait", je veux m'assurer que le second script ne démarre qu'après le premier plus de.

modifier: Le pydoc dit "subprocess.call (* popenargs, ** kwargs) commande Exécuter avec des arguments Attendez commande pour terminer, puis retourner l'attribut returnCode.". Donc, dans la boucle for (ci-dessus), attend-il chaque code de retour avant de passer au script suivant.

Je suis novice dans le domaine du filetage. Je joins le code dépouillé pour la classe qui exécute l'analyse ici. La boucle subprocess.call fait partie de cette classe.

class ThreadedDataProcessor(Thread): 
      def __init__(self, in_queue, out_queue): 
       # Uses Queue 
       Thread.__init__(self) 
       self.in_queue = in_queue 
       self.out_queue = out_queue 
      def run(self): 
       while True: 
        path = self.in_queue.get() 
        if path is None: 
         break 
        myprocessor = ProcessorScriptCreator(path) 
        scrfiles = myprocessor.create_and_return_shell_scripts() 

       for index,file in enumerate(scrfiles): 
        subprocess.call([file]) 
        print "CALLED%s%s" % (index,file) *5 
       #report(myfile.describe()) 
       #report("Done %s" % path) 
       self.out_queue.put(path) 
       in_queue = Queue() 
+0

Désolé ne savait pas sur "taux d'acceptation" sur stackoverflow. – harijay

+0

@Rafe Kettler: J'ai lu la section sur subprocess.call() dans le doc. Si je ne me trompe pas, la boucle for attendra chaque code avant le prochain tour de la boucle for - est-ce le cas? – harijay

Répondre

2

La boucle en série appeler chaque script, attendez jusqu'à ce qu'il soit terminé, puis appeler le prochain quel que soit le succès ou l'échec de l'appel précédent. Vous voulez sans doute dire:

try: 
    map(subprocess.check_call, script_list) 
except Exception, e: 
    # failed script 

Un nouveau thread commence par chaque appel à run, et à la fin aussi quand run est fait. Vous itérez sur le script avec sous-processus dans un thread.

Vous devez vous assurer que chaque ensemble d'appels de chaque thread n'aura pas d'impact sur les autres appels d'autres threads. Par exemple, essayez de lire et d'écrire dans le même fichier à partir d'un appel de script dans plusieurs threads en même temps.