Używam Pythona do zarządzania niektórymi symulacjami. Buduję parametry i uruchamiam program, używając:Jak zatrzymać Pythona od propagacji sygnałów do podprocesów?
pipe = open('/dev/null', 'w')
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
Mój kod obsługuje inny sygnał. Ctrl + C przerwie symulację, zapyta, czy chcę zapisać, i wyjdę z wdziękiem. Mam inne procedury obsługi sygnału (np. W celu wymuszenia danych wyjściowych).
Chcę wysłać sygnał (SIGINT, Ctrl + C) do mojego skryptu python, który zapyta użytkownika, jaki sygnał chce wysłać do programu.
Jedyna rzecz zapobiegania kod do pracy jest to, że wydaje się, że cokolwiek robię, Ctrl + C będzie „przekazany” do podproces: kod złapie go i wyjście:
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)
[...]
Tak cokolwiek robię, program otrzymuje SIGINT, który chcę tylko, aby mój skrypt python mógł zobaczyć. Jak mogę to zrobić???
Próbowałem również:
signal.signal(signal.SIGINT, signal.SIG_IGN)
pid = subprocess.Popen(shlex.split(command), stdout=pipe, stderr=pipe)
signal.signal(signal.SIGINT, signal.SIG_DFL)
aby uruchomić program, ale daje ten sam wynik: program łapie SIGINT.
Thanx!
Dzięki za Twoją sugestię. Myślę, że to zbyt skomplikowany cel, jaki mam. Zasadniczo chcę tylko wstrzymać skrypt nadrzędny, zapytać użytkownika o coś i wysłać sygnał do wszystkich procesów podrzędnych. Może kolejne naciśnięcie klawisza może zatrzymać skrypt nadrzędny, na przykład ctrl + x? –
Tak, jak już powiedziałem, naprawdę nie poleciłbym tego rozwiązania. Możesz użyć dowolnej kombinacji klawiszy, która ma zostać zatrzymana, jeśli chcesz odsłuchać zdarzenia na klawiaturze w osobnym wątku. –