Ctrl-C не работает с PyQt

Почему не работает Ctrl + C, чтобы разбить программу Python, использующую PyQt? Я хочу отладить его и получить трассировку стека, и по какой-то причине это сложнее сделать, чем с С++!

Ответ 1

CTRL + C вызывает передачу сигнала на процесс. Python ловит сигнал и устанавливает глобальную переменную, что-то вроде CTRL_C_PRESSED = True. Затем, когда интерпретатор Python получает для выполнения нового кода операции, он видит переменная set и повышает KeybordInterrupt.

Это означает, что CTRL + C работает только в том случае, если интерпретатор Python вращается. Если интерпретатор выполняет модуль расширения, написанный на C, который выполняет длительную операцию, CTRL + C не будет прерывать его, если только он явно "взаимодействует" с Python. Например: time.sleep() теоретически является блокировки, но реализация этой функции "сотрудничает" с Python интерпретатор для работы CTRL + C.

Это все по дизайну: CTRL + C означает совершить "чистое прерывание"; вот почему превращается в исключение Python (чтобы очистка была выполненный во время разворачивания стека), и его поддержка модулей расширения - это сортировка "отказаться". Если вы хотите полностью прервать процесс, не давая ему возможность очистки, вы можете использовать CTRL +.

Когда Python вызывает QApplication:: exec() (функция С++), Qt не знает как "сотрудничать" с Python для CTRL + C, и именно поэтому он не Работа. Я не думаю, что там хороший способ "заставить его работать"; вы можете захотеть увидеть если вы можете справиться с ней через глобальную фильтр событий. - Джованни Бахо

Добавление этого в основную программу решило проблему.

import signal

signal.signal(signal.SIGINT, signal.SIG_DFL)

Я не уверен, что это связано с объяснением.

Ответ 2

Я согласен с Neil G и добавлю следующее:

Если вы не вызываете QApplication.exec_() для запуска цикла событий и вместо этого выполняете свою программу в интерактивной оболочке python (используя python -i), тогда pyqt будет автоматически обрабатывать события всякий раз, когда ожидает интерактивное приглашение, и Ctrl-C снова должен вести себя так, как ожидалось. Это связано с тем, что цикл событий Qt будет делиться временем с интерпретатором python, а не работать исключительно, позволяя интерпретатору иметь возможность поймать эти прерывания.