subprocess:删除Windows中的子进程

问题描述

在 Windows 上,subprocess.Popen.terminate 调用 win32 的 TerminalProcess.但是,我看到的行为是我试图终止的进程的子进程仍在运行.这是为什么?如何确保进程启动的所有子进程都被杀死?

On Windows, subprocess.Popen.terminate calls win32's TerminalProcess. However, the behavior I see is that child processes of the process I am trying to terminate are still running. Why is that? How do I ensure all child processes started by the process are killed?


解决方案

通过使用psutil:

import psutil, os

def kill_proc_tree(pid, including_parent=True):    
    parent = psutil.Process(pid)
    children = parent.children(recursive=True)
    for child in children:
        child.kill()
    gone, still_alive = psutil.wait_procs(children, timeout=5)
    if including_parent:
        parent.kill()
        parent.wait(5)

me = os.getpid()
kill_proc_tree(me)

相关文章