Ctrl+ DPerbedaan untuk Windows dan Linux
Ternyata pada Python 3.6, juru bahasa Python menangani Ctrl+ Cberbeda untuk Linux dan Windows. Untuk Linux, Ctrl+ Cakan berfungsi sebagian besar seperti yang diharapkan, namun pada Windows Ctrl+ C sebagian besar tidak berfungsi terutama jika Python menjalankan panggilan pemblokiran seperti thread.joinatau menunggu respons web. Namun itu berhasil time.sleep. Inilah penjelasan yang bagus tentang apa yang terjadi pada interpreter Python. Perhatikan bahwa Ctrl+ Cmenghasilkan SIGINT.
Solusi 1: Gunakan Ctrl+ Breakatau Setara
Gunakan pintasan keyboard di bawah ini di jendela terminal / konsol yang akan menghasilkan SIGBREAKpada level yang lebih rendah di OS dan menghentikan interpreter Python.
Mac OS dan Linux
Ctrl+ Shift+ \atau Ctrl+\
Windows :
- Umum: Ctrl+Break
- Dell: Ctrl+ Fn+ F6atau Ctrl+ Fn+S
- Lenovo: Ctrl+ Fn+ F11atau Ctrl+ Fn+B
- HP: Ctrl+ Fn+Shift
- Samsung: Fn+Esc
Solusi 2: Gunakan Windows API
Di bawah ini adalah fungsi praktis yang akan mendeteksi Windows dan menginstal custom handler untuk Ctrl+ Cdi konsol:
#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)
Anda dapat menggunakan di atas seperti ini:
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!
Solusi 3: Metode polling
Saya tidak suka atau merekomendasikan metode ini karena itu tidak perlu mengkonsumsi prosesor dan daya berdampak negatif pada kinerja.
impor threading waktu impor
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