当Python进程被终止时,如何杀死子进程?

6
我正在编写一个python程序,用Popen启动了一个子进程。 我正在读取子进程的stdout,对其进行一些筛选,并将结果写入主进程的stdout。
当我杀死主进程(cntl-C)时,子进程仍然在运行。如何也杀死子进程?子进程可能会运行很长时间。
背景: 我一次只启动一个子进程,而且我正在筛选它的stdout。 用户可能会决定中断并尝试其他操作。
我是python的新手,我使用的是Windows,请温柔点。
3个回答

5

Windows没有信号,因此您无法使用signal模块。但是,当按下Ctrl-C时,仍然可以捕获KeyboardInterrupt异常。

可以尝试以下代码:

import subprocess

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

except KeyboardInterrupt:
    child.terminate()

2
Python文档中关于Popen.wait()的警告:警告:如果子进程生成足够的输出到stdout或stderr管道,以至于它阻塞等待OS管道缓冲区接受更多数据,则会发生死锁。使用communicate()来避免这种情况。 - pythonic metaphor
1
实际上,在Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32上,signal.signal(signal.SIGINT, handlerFunc) 完全可以正常工作;我刚试过了。 - RobM

0

subprocess.Popen对象带有kill和terminate方法(不同之处在于您发送给进程的信号)。

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


0
你可以使用 Python 的 atexit 模块。
例如:
import atexit

def killSubprocess():
    mySubprocess.kill()

atexit.register(killSubprocess)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接