Ctrl+ DSự khác biệt cho Windows và Linux
Hóa ra là từ Python 3.6, trình thông dịch Python xử lý Ctrl+ Ckhác nhau cho Linux và Windows. Đối với Linux, Ctrl+ Csẽ hoạt động chủ yếu như mong đợi tuy nhiên trên Windows Ctrl+ C hầu như không hoạt động, đặc biệt nếu Python đang chạy cuộc gọi chặn như thread.join
hoặc chờ phản hồi trên web. Nó làm việc cho time.sleep
, tuy nhiên. Đây là lời giải thích hay về những gì đang diễn ra trong trình thông dịch Python. Lưu ý rằng Ctrl+ Ctạo SIGINT
.
Giải pháp 1: Sử dụng Ctrl+ Breakhoặc tương đương
Sử dụng các phím tắt bên dưới trong cửa sổ terminal / console sẽ tạo SIGBREAK
ở mức thấp hơn trong HĐH và chấm dứt trình thông dịch Python.
Hệ điều hành Mac và Linux
Ctrl+ Shift+ \hoặc Ctrl+\
Windows :
- Chung: Ctrl+Break
- Dell: Ctrl+ Fn+ F6hoặc Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11hoặc Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Giải pháp 2: Sử dụng API Windows
Dưới đây là các chức năng tiện dụng sẽ phát hiện Windows và cài đặt trình xử lý tùy chỉnh cho Ctrl+ Ctrong bảng điều khiển:
#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)
Bạn có thể sử dụng ở trên như thế này:
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!
Giải pháp 3: Phương pháp bỏ phiếu
Tôi không thích hoặc đề xuất phương pháp này vì nó không cần thiết tiêu thụ bộ xử lý và sức mạnh ảnh hưởng tiêu cực đến hiệu suất.
nhập luồng thời gian nhập
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