在KeyboardInterrupt之后杀死subprocess.call

时间:2015-11-03 10:12:08

标签: python process subprocess kill

当我得到键盘中断(ctrl-c)时,我需要停止使用Python中的subprocess.call创建的进程

问题是,在完成执行之前,p不会分配给它的值

  

p = 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')

1 个答案:

答案 0 :(得分:7)

  1. p只是一个整数(.returncode),因此没有.pid属性(运行您的代码,按 CTRL + C ,看看会发生什么)

  2. 在POSIX上,SIGINT被发送到终端的前台进程组,因此应该杀死孩子而不需要您执行任何其他操作,请参阅How CTRL+C works
    您也可以检查孩子是否也在Windows上终止。

  3. 如果孩子未在KeyboardInterrupt被杀,那么您可以手动执行:subprocess.call() is just Popen().wait() - 您可以自己调用:

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