2009-10-21 28 views
6

Estoy escribiendo un programa python que ejecuta un subproceso (usando Popen). Estoy leyendo la salida estándar del subproceso, haciendo un poco de filtrado y escribiendo al estándar del proceso principal.¿matar el subproceso cuando se mata el proceso de python?

Cuando elimino el proceso principal (cntl-C), el subproceso continúa en ejecución. ¿Cómo puedo matar el subproceso también? El subproceso es similar a ejecutar durante mucho tiempo.

Contexto: Estoy iniciando solo un subproceso a la vez, estoy filtrando su stdout. El usuario puede decidir interrumpir para intentar algo más.

Soy nuevo en python y estoy usando Windows, así que sea amable.

Respuesta

5

Windows no tiene señales, por lo que no puede usar el módulo de señal. Sin embargo, aún puede detectar la excepción KeyboardInterrupt cuando se presiona Ctrl-C.

Algo como esto debe conseguir que va:

import subprocess 

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

except KeyboardInterrupt: 
    child.terminate() 
+2

Una advertencia de la documentación de pitón en Popen.wait(): Advertencia Este será un punto muerto si el proceso hijo genera suficiente salida a un tubo de salida estándar o stderr tal que bloquea a la espera para que el búfer de tuberías del sistema operativo acepte más datos. Usa communica() para evitar eso. –

+1

En realidad 'signal.signal (signal.SIGINT, handlerFunc)' funciona bien en Python 2.6.5 (r265: 79096, 19 de marzo de 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] en win32 ; Lo intenté. – RobM

0

objetos subprocess.Popen vienen con una matanza y un método por terminado (difiere en que la señal se envía al proceso).

signal.signal le permite instalar manejadores de señal, en los que puede llamar al método de matar del niño.

0

Puede usar el módulo python atexit.

Por ejemplo:

import atexit 

def killSubprocess(): 
    mySubprocess.kill() 

atexit.register(killSubprocess) 
Cuestiones relacionadas