Sto usando python per gestire alcune simulazioni. Costruisco i parametri ed eseguo il programma usando:Come impedire a Python di propagare i segnali ai sottoprocessi?
pipe = open('/dev/null', 'w')
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
Il mio codice gestisce un segnale diverso. Ctrl + C interromperà la simulazione, chiederà se voglio salvare ed esco con grazia. Ho altri gestori di segnale (per forzare l'output dei dati, ad esempio).
Quello che voglio è inviare un segnale (SIGINT, Ctrl + C) al mio script python che chiederà all'utente quale segnale vuole inviare al programma.
L'unica cosa che impedisce il codice per lavoro è che sembra che tutto quello che faccio, Ctrl + C sarà "inoltrata" al sottoprocesso: il codice sarà prenderlo e l'uscita:
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)
[...]
Così qualunque cosa faccia, il programma sta ricevendo il SIGINT che voglio solo vedere dal mio script python. Come lo posso fare???
Ho anche provato:
signal.signal(signal.SIGINT, signal.SIG_IGN)
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
signal.signal(signal.SIGINT, signal.SIG_DFL)
per eseguire il programma, ma questo dà lo stesso risultato: il programma cattura l'SIGINT.
Grazie!
Grazie per il tuo suggerimento. Penso che sia troppo complicato per l'obiettivo che ho però. Fondamentalmente, voglio solo mettere in pausa lo script genitore, chiedere all'utente qualcosa e inviare un segnale a tutti i processi figli. Forse un altro input da tastiera potrebbe mettere in pausa lo script genitore, come ctrl + x? –
Sì, come ho detto, non raccomanderei davvero la soluzione. È possibile utilizzare qualsiasi combinazione di tasti che si desidera mettere in pausa il genitore se si ascoltano eventi di tastiera in un thread separato. –