Czy istnieje sposób przerwania (Ctrl+C
) skryptu w języku Python na podstawie pętli osadzonej w rozszerzeniu Cython?Cython, Python i KeyboardInterrupt ignorowane
Mam następujący skrypt Pythona:
def main():
# Intantiate simulator
sim = PySimulator()
sim.Run()
if __name__ == "__main__":
# Try to deal with Ctrl+C to abort the running simulation in terminal
# (Doesn't work...)
try:
sys.exit(main())
except (KeyboardInterrupt, SystemExit):
print '\n! Received keyboard interrupt, quitting threads.\n'
ten uruchamia pętlę, która jest częścią rozszerzenia C++ Cython. Następnie, naciskając Ctrl+C
, KeyboardInterrupt
jest generowany, ale ignorowany, a program kontynuuje działanie aż do końca symulacji.
Prace wokół znalazłem, to obsłużyć wyjątek od wewnątrz rozszerzenia poprzez łapanie sygnału SIGINT
:
#include <execinfo.h>
#include <signal.h>
static void handler(int sig)
{
// Catch exceptions
switch(sig)
{
case SIGABRT:
fputs("Caught SIGABRT: usually caused by an abort() or assert()\n", stderr);
break;
case SIGFPE:
fputs("Caught SIGFPE: arithmetic exception, such as divide by zero\n",
stderr);
break;
case SIGILL:
fputs("Caught SIGILL: illegal instruction\n", stderr);
break;
case SIGINT:
fputs("Caught SIGINT: interactive attention signal, probably a ctrl+c\n",
stderr);
break;
case SIGSEGV:
fputs("Caught SIGSEGV: segfault\n", stderr);
break;
case SIGTERM:
default:
fputs("Caught SIGTERM: a termination request was sent to the program\n",
stderr);
break;
}
exit(sig);
}
wówczas:
signal(SIGABRT, handler);
signal(SIGFPE, handler);
signal(SIGILL, handler);
signal(SIGINT, handler);
signal(SIGSEGV, handler);
signal(SIGTERM, handler);
Nie można dokonać tej pracy z Pythonem , a przynajmniej z Cython? Ponieważ mam zamiar przenieść moje rozszerzenie pod Windows/MinGW, byłbym wdzięczny za posiadanie czegoś mniej specyficznego dla Linuksa.
+1 za wyjaśnienie. Czy 'PyErr_CheckSignals()' obsługuje Ctrl-C w systemie Windows? Zdecydowałem się na niejawne sprawdzanie sygnału przez 'while while.running: time.sleep (1)' w głównym wątku, który działa tak długo jak kod Cython w innym wątku zwalnia GIL okresowo. – jfs
Tak, działa w systemie Windows zgodnie z oczekiwaniami. –
Użyłem '' opt out "' wrong. Mam na myśli coś przeciwnego: 's/opt out/choose to do'/above. – jfs