在Python进程被终止时杀死子进程?

6 投票
3 回答
4490 浏览
提问于 2025-04-15 15:15

我正在写一个Python程序,这个程序会启动一个子进程(用Popen)。

我会读取这个子进程的输出,然后进行一些筛选,最后把结果写回主进程的输出。

但是,当我用Ctrl-C来终止主进程时,子进程却还在继续运行。请问我该如何同时结束子进程呢?因为这个子进程可能会运行很长时间。

背景信息:我一次只启动一个子进程,并且在筛选它的输出。用户可能会决定中断程序,想尝试其他事情。

我对Python还很陌生,而且我是在Windows系统上操作,所以请多多指教。

3 个回答

0

你可以使用Python的 atexit 模块。

比如说:

import atexit

def killSubprocess():
    mySubprocess.kill()

atexit.register(killSubprocess)
0

subprocess.Popen 对象有两个方法,分别是 kill 和 terminate(这两个方法发送给进程的信号不同)。

signal.signal 让你可以设置信号处理器,在这些处理器里你可以调用子进程的 kill 方法。

5

Windows系统没有信号这个概念,所以你不能使用信号模块。不过,当你按下Ctrl-C时,还是可以捕捉到KeyboardInterrupt这个异常。

你可以试试下面这样的代码:

import subprocess

try:
    child = subprocess.Popen(blah)
    child.wait() 

except KeyboardInterrupt:
    child.terminate()

撰写回答