【问题标题】:[Windows,python]How to make process started by subprocee.Popen() to automatically terminate when the parent process is dead?[Windows,python]如何让subprocess.Popen()启动的进程在父进程死亡时自动终止?
【发布时间】:2019-12-10 06:36:55
【问题描述】:

在我的 python 脚本中,我使用以下方法启动了一些进程:

p1 = subprocess.Popen('p1.exe')
p2 = subprocess.Popen('p2.exe')

当这两个子进程启动时,当父进程因为某些错误而死时,它们不会被杀死。
我希望这三个进程,父进程,p1和p2同时退出.也就是说,其中任何一个终止都会使所有其他终止。我如何在 Windows 上进行管理? Linux 呢?

【问题讨论】:

    标签: python windows subprocess


    【解决方案1】:

    假设父进程死于异常(而不是像分段错误这样的硬错误),一个简单的try/finally 可以保证进程在退出块时终止(通过执行从结束,异常冒泡,return 提前离开函数等):

    p1 = p2 = None  # Ensure names exist
    try:
        p1 = subprocess.Popen('p1.exe')
        p2 = subprocess.Popen('p2.exe')
        # ... stuff that runs in tandem with processes
    
    finally:
        for p in (p1, p2):
            if p is not None:
                p.terminate()
    

    如果您希望子进程更干净地关闭,一个简单的with 语句就足够了(std 句柄将被关闭,您将等待每个进程):

    with subprocess.Popen('p1.exe') as p1, subprocess.Popen('p2.exe') as p2:
        # ... stuff that runs in tandem with processes
    

    如果要启动进程并在父进程启动时运行,则您应该使用the atexit module 将它们注册为在主进程退出时终止:

    import atexit
    
    p1 = subprocess.Popen('p1.exe')
    atexit.register(p1.terminate)
    p2 = subprocess.Popen('p2.exe')
    atexit.register(p2.terminate)
    # ... rest of your code
    

    【讨论】: