2015-11-03 1 views
3

je dois arrêter un processus créé à l'aide subprocess.call en Python quand je reçois un clavier d'interruption (ctrl-c)Tuer subprocess.call après KeyboardInterrupt

La question est p ne soit pas une valeur assignée à jusqu'à ce qu'il termine l'exécution

p = subprocess.call (cmd)

Je ne peux pas utiliser os.kill pour tuer cela. En outre, ne peut pas utiliser shell=True pour des raisons.

Ce que je voudrais faire est:

try: 
    p = subprocess.call(cmd) 
except KeyboardInterrupt: 
    os.kill(p.pid,signal.SIGTERM) 
    sys.exit('exited after ctrl-c') 
+0

Vous pouvez obtenir le pid d'un processus enfant tel que décrit ici: http://stackoverflow.com/questions/3332043/obtaining-pid-of-child-process –

+0

Merci, mais c'est * nix spécifique. J'ai besoin de compat sur Windows aussi. – anujdeshpande

Répondre

4
  1. p est juste un entier (.returncode) et donc il n'y a pas .pid attribut (exécuter votre code, appuyez sur CTRL + C et voir ce qui se passe)

  2. Sur POSIX, SIGINT est envoyé au groupe de processus de premier plan du terminal et, par conséquent, l'enfant doit être tué sans aucune action supplémentaire de votre part, voir How CTRL+C works
    Vous pouvez également vérifier si l'enfant est également arrêté sur Windows.

Si l'enfant n'a pas été tué KeyboardInterrupt alors vous pouvez le faire manuellement: subprocess.call() is just Popen().wait() - vous pouvez appeler vous-même:

p = subprocess.Popen(cmd) 
try: 
    p.wait() 
except KeyboardInterrupt: 
    try: 
     p.terminate() 
    except OSError: 
     pass 
    p.wait()