在KeyboardInterrupt之后杀死subprocess.call

anu*_*nde 3 python subprocess kill process

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

问题是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')
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 8

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

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

如果孩子没有被杀,KeyboardInterrupt那么你可以手动完成:subprocess.call()只是Popen().wait() - 你可以自己调用它:

p = subprocess.Popen(cmd)
try:
    p.wait()
except KeyboardInterrupt:
    try:
       p.terminate()
    except OSError:
       pass
    p.wait()
Run Code Online (Sandbox Code Playgroud)