2010-07-07 5 views
2

Je souhaite séquentiellement exécuter des scripts c qui fourchent leurs propres processus (dans une nouvelle fenêtre de ligne de commande) et donner le "Press any key to continue..." lorsqu'ils sont terminés. Techniquement, c'est un compilateur spécial. Il apparaît avec une fenêtre de ligne de commande et me dit si la compilation a réussi ou non. Mais que les fourches de la fenêtre de ligne de commande de nouveaux processus de compilation, qui font ce retour 0 avant qu'il ne devrait ..Utilisation du sous-processus pour savoir quand un processus se termine

Ma première tentative de c'était

process = subprocess.Popen(cmd) 
    process.wait() 

en itérer sur chaque fichier. Malheureusement, cela n'attend pas le "Appuyez sur n'importe quelle touche pour continuer ..." et explose dans mon visage. Il semble que l'appel wait() est passé lorsqu'un processus interne est terminé (auquel je n'ai pas accès). Comment puis-je, à la place, attendre "Appuyez sur n'importe quelle touche pour continuer ..."? Il est également l'impression d'autres informations avant que la presse une touche pour continuer la ligne ..

Actuellement, voici ce que mon code est:

  process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE) 
      completed = False 
      while not completed: 
       if process.poll() is not None: 
        completed = True 

      print "communicating" 
      process.communicate("k") 
      print "communicated" 
+1

Le nouveau code n'a pas de sens: vous êtes occupé à attendre la fin du processus (wait() ferait la même chose, seulement sans surchauffer votre CPU) et ensuite essayer de communiquer avec un processus mort! Si le script que vous lancez forke un nouveau processus en arrière-plan et revient immédiatement, il n'y a pas grand-chose à faire. Vous devriez obtenir le pid du petit-fils et ensuite faire un os.wait() dessus. –

Répondre

2

Vous pouvez utiliser subprocess.poll pour vérifier l'état sans blocage et subprocess.communicate à envoyer des informations au sous-processus.

+0

S'il me donne "Appuyez sur n'importe quelle touche pour continuer ..." je pensais qu'il n'avait pas encore de valeur? Cela ne rendrait-il pas inutiles les sous-processus.poll? – hungrydude

+0

Ouais, cela ne semble pas l'attendre pour imprimer "Appuyez sur n'importe quelle touche pour continuer ..." – hungrydude

+0

Essayez simplement d'utiliser communiquer - bien sûr cela suppose que 'stdout' et' stdin' ont été liés au 'sous-processus .PIPE', donc vous devrez le changer en '.Popen (cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE)' –

Questions connexes