有没有办法确保所有创建的子进程在Python程序退出时都消失了?所谓子流程,是指那些用subprocess.Popen()创建的内容。
如果不是,我是否应该遍历所有发出的终止点,然后终止-9?有什么清洁剂吗?
您可以为此使用 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!
注意 -如果该进程(父进程)被杀死,则不会运行注册的函数。
python > = 2.6不再需要以下Windows方法
这是一种杀死Windows中进程的方法。您的Popen对象具有pid属性,因此您可以通过 success = win_kill(p.pid) 调用它(需要安装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