Có cách nào để ngắt (Ctrl+C
) một tập lệnh Python dựa trên vòng lặp được nhúng trong phần mở rộng của Cython không?Cython, Python và KeyboardInterrupt bị bỏ qua
Tôi có kịch bản python sau:
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'
này chạy một vòng lặp là một phần của một phần mở rộng C++ Cython. Sau đó, trong khi nhấn Ctrl+C
, số KeyboardInterrupt
bị ném nhưng bị bỏ qua và chương trình sẽ tiếp tục cho đến khi kết thúc mô phỏng.
Công việc xung quanh tôi thấy, là để xử lý các ngoại lệ từ bên trong phần mở rộng bằng cách bắt các tín hiệ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);
}
Sau đó:
signal(SIGABRT, handler);
signal(SIGFPE, handler);
signal(SIGILL, handler);
signal(SIGINT, handler);
signal(SIGSEGV, handler);
signal(SIGTERM, handler);
Tôi không thể làm công việc này từ Python hoặc ít nhất là từ Cython? Khi tôi sắp mở rộng phần mở rộng của mình trong Windows/MinGW, tôi sẽ đánh giá cao việc có một cái gì đó ít Linux cụ thể hơn.
+1 để giải thích. Có 'PyErr_CheckSignals()' xử lý Ctrl-C trên Windows? Tôi đã chọn không tham gia kiểm tra tín hiệu ngầm bằng vòng lặp 'while sim.running: time.sleep (1)' trong chuỗi chính hoạt động miễn là mã Cython trong một luồng khác phát hành GIL theo định kỳ. – jfs
Có, nó hoạt động trên Windows như mong đợi. –
Tôi đã sử dụng '" chọn không tham gia "' sai. Tôi đã có nghĩa là đối diện: 's/chọn không tham gia/chọn để làm /' ở trên. – jfs