Ctrl+ DРазница для Windows и Linux
Оказывается, что начиная с Python 3.6 интерпретатор Python работает Ctrl+ по- Cразному для Linux и Windows. Для Linux Ctrl+ Cбудет работать в основном так, как ожидалось, однако в Windows Ctrl+ в C основном не работает, особенно если Python выполняет блокирующий вызов, например thread.join
или ожидает веб-ответа. Однако это работает time.sleep
. Вот красивое объяснение того, что происходит в интерпретаторе Python. Обратите внимание, что Ctrl+ Cгенерирует SIGINT
.
Решение 1. Используйте Ctrl+ Breakили эквивалент
Используйте приведенные ниже сочетания клавиш в окне терминала / консоли, которые будут генерироваться SIGBREAK
на более низком уровне в ОС и завершать интерпретатор Python.
Mac OS и Linux
Ctrl+ Shift+ \или Ctrl+\
Окна :
- Общие: Ctrl+Break
- Dell: Ctrl+ Fn+ F6или Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11или Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Решение 2. Используйте Windows API
Ниже приведены удобные функции, которые обнаруживают Windows и устанавливают собственный обработчик для Ctrl+ Cв консоли:
#win_ctrl_c.py
import sys
def handler(a,b=None):
sys.exit(1)
def install_handler():
if sys.platform == "win32":
import win32api
win32api.SetConsoleCtrlHandler(handler, True)
Вы можете использовать это так:
import threading
import time
import win_ctrl_c
# do something that will block
def work():
time.sleep(10000)
t = threading.Thread(target=work)
t.daemon = True
t.start()
#install handler
install_handler()
# now block
t.join()
#Ctrl+C works now!
Решение 3. Метод опроса
Я не предпочитаю и не рекомендую этот метод, потому что он излишне потребляет процессор и мощность, что негативно сказывается на производительности.
импорт потоковой передачи время импорта
def work():
time.sleep(10000)
t = threading.Thread(target=work)
t.daemon = True
t.start()
while(True):
t.join(0.1) #100ms ~ typical human response
# you will get KeyboardIntrupt exception