【问题标题】:kill subprocess when python process is killed?python进程被杀死时杀死子进程?
【发布时间】:2025-09-06 00:05:02
【问题描述】:

我正在编写一个启动子进程的 python 程序(使用 Popen)。 我正在读取子进程的标准输出,进行一些过滤,然后写入 主进程的标准输出。

当我终止主进程 (cntl-C) 时,子进程继续运行。 我如何也杀死子进程?子进程可能会运行很长时间。

上下文: 我一次只启动一个子进程,我正在过滤它的标准输出。 用户可能会决定中断以尝试其他操作。

我是python新手,我用的是windows,所以请温柔。

【问题讨论】:

    标签: python windows process


    【解决方案1】:

    Windows 没有信号,所以不能使用信号模块。但是,当按下 Ctrl-C 时,您仍然可以捕获 KeyboardInterrupt 异常。

    这样的事情应该会让你继续前进:

    import subprocess
    
    try:
        child = subprocess.Popen(blah)
        child.wait() 
    
    except KeyboardInterrupt:
        child.terminate()
    

    【讨论】:

    • Popen.wait() 上的 python 文档中的警告:警告如果子进程生成足够的输出到 stdout 或 stderr 管道以使其阻塞等待 OS 管道缓冲区接受,这将死锁更多数据。使用communicate() 来避免这种情况。
    • 实际上signal.signal(signal.SIGINT, handlerFunc) 在 Win32 上的 Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] 上工作得很好;我刚试过。
    【解决方案2】:

    subprocess.Popen 对象带有一个 kill 和一个 terminate 方法(发送给进程的信号不同)。

    signal.signal 允许您安装信号处理程序,您可以在其中调用孩子的 kill 方法。

    【讨论】:

      【解决方案3】:

      你可以使用pythonatexit模块。

      例如:

      import atexit
      
      def killSubprocess():
          mySubprocess.kill()
      
      atexit.register(killSubprocess)
      

      【讨论】: