【发布时间】:2025-09-06 00:05:02
【问题描述】:
我正在编写一个启动子进程的 python 程序(使用 Popen)。 我正在读取子进程的标准输出,进行一些过滤,然后写入 主进程的标准输出。
当我终止主进程 (cntl-C) 时,子进程继续运行。 我如何也杀死子进程?子进程可能会运行很长时间。
上下文: 我一次只启动一个子进程,我正在过滤它的标准输出。 用户可能会决定中断以尝试其他操作。
我是python新手,我用的是windows,所以请温柔。
【问题讨论】:
我正在编写一个启动子进程的 python 程序(使用 Popen)。 我正在读取子进程的标准输出,进行一些过滤,然后写入 主进程的标准输出。
当我终止主进程 (cntl-C) 时,子进程继续运行。 我如何也杀死子进程?子进程可能会运行很长时间。
上下文: 我一次只启动一个子进程,我正在过滤它的标准输出。 用户可能会决定中断以尝试其他操作。
我是python新手,我用的是windows,所以请温柔。
【问题讨论】:
Windows 没有信号,所以不能使用信号模块。但是,当按下 Ctrl-C 时,您仍然可以捕获 KeyboardInterrupt 异常。
这样的事情应该会让你继续前进:
import subprocess
try:
child = subprocess.Popen(blah)
child.wait()
except KeyboardInterrupt:
child.terminate()
【讨论】:
signal.signal(signal.SIGINT, handlerFunc) 在 Win32 上的 Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] 上工作得很好;我刚试过。
subprocess.Popen 对象带有一个 kill 和一个 terminate 方法(发送给进程的信号不同)。
signal.signal 允许您安装信号处理程序,您可以在其中调用孩子的 kill 方法。
【讨论】:
你可以使用pythonatexit模块。
例如:
import atexit
def killSubprocess():
mySubprocess.kill()
atexit.register(killSubprocess)
【讨论】: