Estoy usando Python para administrar algunas simulaciones. Construyo los parámetros y ejecuto el programa usando:¿Cómo evitar que python propague señales a subprocesos?
pipe = open('/dev/null', 'w')
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
Mi código maneja una señal diferente. Ctrl + C detendrá la simulación, preguntará si quiero guardar y saldrá con elegancia. Tengo otros manejadores de señal (para forzar la salida de datos, por ejemplo).
Lo que quiero es enviar una señal (SIGINT, Ctrl + C) a mi script python que le preguntará al usuario qué señal desea enviar al programa.
El único que impide que el código funcione es que parece que todo lo que hago, Ctrl + C será "remitido" al subproceso: el código lo cogerá y salida:
try:
<wait for available slots>
except KeyboardInterrupt:
print "KeyboardInterrupt catched! All simulations are paused. Please choose the signal to send:"
print " 0: SIGCONT (Continue simulation)"
print " 1: SIGINT (Exit and save)"
[...]
answer = raw_input()
pid.send_signal(signal.SIGCONT)
if (answer == "0"):
print " --> Continuing simulation..."
elif (answer == "1"):
print " --> Exit and save."
pid.send_signal(signal.SIGINT)
[...]
Así haga lo que haga, el programa recibe el SIGINT que solo quiero que vea mi script de python. ¿¿¿Cómo puedo hacer eso???
También probé:
signal.signal(signal.SIGINT, signal.SIG_IGN)
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
signal.signal(signal.SIGINT, signal.SIG_DFL)
para ejecutar el programa, pero esto le da el mismo resultado: el programa capta la SIGINT.
Gracias!
Gracias por su sugerencia. Creo que es demasiado complicado para el objetivo que tengo. Básicamente, solo quiero pausar el script principal, preguntar algo al usuario y enviar una señal a todos los procesos secundarios. ¿Quizás otra entrada de teclado podría pausar el script principal, como ctrl + x? –
Sí, como dije, realmente no recomendaría la solución. Puede usar cualquier combinación de teclas para pausar al padre si escucha los eventos del teclado en un hilo separado. –