当我得到键盘中断(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')
答案 0 :(得分:7)
p
只是一个整数(.returncode
),因此没有.pid
属性(运行您的代码,按 CTRL + C ,看看会发生什么)
在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()