您可以使用atexit为此,并注册程序退出时要运行的任何清理任务。
atexit.register(func[ *args[ **kargs]])
在清理过程中,您还可以实现自己的等待,并在发生所需的超时时终止它。
>>> import atexit
>>> import sys
>>> import time
>>>
>>>
>>>
>>> def cleanup():
... timeout_sec = 5
... for p in all_processes: # list of your processes
... p_sec = 0
... for second in range(timeout_sec):
... if p.poll() == None:
... time.sleep(1)
... p_sec += 1
... if p_sec >= timeout_sec:
... p.kill() # supported from python 2.6
... print 'cleaned up!'
...
>>>
>>> atexit.register(cleanup)
>>>
>>> sys.exit()
cleaned up!
Note-- 如果该进程(父进程)被终止,注册的函数将不会运行。
对于 python >= 2.6 不再需要以下 Windows 方法
这是在 Windows 中终止进程的方法。你的 Popen 对象有一个 pid 属性,所以你可以通过以下方式调用它成功 = win_kill(p.pid) (Needs pywin32安装):
def win_kill(pid):
'''kill a process by specified PID in windows'''
import win32api
import win32con
hProc = None
try:
hProc = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pid)
win32api.TerminateProcess(hProc, 0)
except Exception:
return False
finally:
if hProc != None:
hProc.Close()
return True