2015-11-03 1 views
3

Мне нужно, чтобы остановить процесс, созданный с помощью subprocess.call в Python, когда я получаю клавиатуры прерывания (Ctrl-C)убийство subprocess.call после KeyboardInterrupt

Проблема р не получает значение, присвоенное ему до него завершает выполнение

р = subprocess.call (CMD)

Так что я не могу использовать os.kill убить этого. Кроме того, нельзя использовать shell=True, потому что причины.

То, что я хотел бы сделать, это:

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

Вы можете получить PID дочернего процесса, как описано здесь: http://stackoverflow.com/questions/3332043/obtaining-pid-of-child-process –

+0

Спасибо, но это * nix specific. Мне тоже нужна поддержка Windows. – anujdeshpande

ответ

4
  1. p только целое число (.returncode) и, следовательно, нет .pid атрибут (запустить ваш код, нажмите CTRL + C и посмотреть, что произойдет)

  2. О POSIX, SIGINT отправляется в группу процессов переднего плана терминала, поэтому ребенок должен быть убит без каких-либо дополнительных действий с вашей стороны, см. How CTRL+C works
    Вы также можете проверить, завершен ли ребенок в Windows.

Если ребенок не был убит на KeyboardInterrupt, то вы можете сделать это вручную: subprocess.call() is just Popen().wait() - вы могли бы назвать это сами:

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

 Смежные вопросы

  • Нет связанных вопросов^_^