Python 键盘中断后Kill subprocess.call

Python 键盘中断后Kill subprocess.call,python,process,subprocess,kill,Python,Process,Subprocess,Kill,当我收到键盘中断(ctrl-c)时,我需要停止使用Python中的subprocess.call创建的进程 问题是p在完成执行之前不会得到分配给它的值 p=子流程调用(cmd) 所以我不能用os.kill来杀死它。此外,由于某些原因,无法使用shell=True 我想做的是: try: p = subprocess.call(cmd) except KeyboardInterrupt: os.kill(p.pid,signal.SIGTERM) sys.exit('exited af

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

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

p=子流程调用(cmd)

所以我不能用
os.kill
来杀死它。此外,由于某些原因,无法使用
shell=True

我想做的是:

try:
  p = subprocess.call(cmd)
except KeyboardInterrupt:
  os.kill(p.pid,signal.SIGTERM)
  sys.exit('exited after ctrl-c')
  • p
    只是一个整数(
    .returncode
    ),因此没有
    .pid
    属性(运行代码,按CTRL+C,看看会发生什么)

  • 在POSIX上,
    SIGINT
    被发送到终端的前台进程组,因此您无需执行任何额外操作即可杀死子进程,请参见
    您也可以检查子级是否在Windows上终止

  • 如果孩子不是在键盘中断上被杀死的,那么你可以手动执行:--你可以自己调用它:

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

    您可以获得子进程的pid,如下所述:谢谢,但它是*nix特定的。我也需要Windows上的compat。