Saya memiliki skrip python yang menggunakan utas dan membuat banyak permintaan HTTP. Saya pikir apa yang terjadi adalah bahwa sementara permintaan HTTP (menggunakan urllib2) sedang membaca, itu memblokir dan tidak merespons CtrlCuntuk menghentikan program. Apakah ada cara untuk mengatasi ini?
128
Jawaban:
Di Windows, satu-satunya cara pasti adalah menggunakan CtrlBreak. Hentikan setiap skrip python secara instan!
(Perhatikan bahwa pada beberapa keyboard, "Break" diberi label sebagai "Jeda".)
sumber
Break
? Bagaimana cara saya mengetiknya?Menekan Ctrl+ cketika program python sedang berjalan akan menyebabkan python memunculkan
KeyboardInterrupt
eksepsi. Kemungkinan program yang membuat banyak permintaan HTTP akan memiliki banyak kode penanganan perkecualian. Jikaexcept
bagian daritry
-except
blok tidak menentukan pengecualian mana yang harus ditangkap, itu akan menangkap semua pengecualian termasukKeyboardInterrupt
yang baru saja Anda sebabkan. Program python yang dikodekan dengan benar akan menggunakan hierarki pengecualian python dan hanya menangkap pengecualian yang diturunkanException
.Jika Anda tidak dapat mengubah kode (atau harus mematikan program sehingga perubahan Anda akan berlaku) maka Anda dapat mencoba menekan Ctrl+ cdengan cepat. Yang pertama dari
KeyboardInterrupt
pengecualian akan mengetuk program anda keluar daritry
blok dan mudah-mudahan salah satu kemudianKeyboardInterrupt
pengecualian akan dibangkitkan ketika program luar daritry
blok.sumber
Jika itu berjalan di shell Python menggunakan Ctrl+ Z, jika tidak menemukan
python
proses dan membunuhnya.sumber
^Z
->[1]+ Stopped
->kill %1
untuk menghentikan pekerjaan # 1 (atau pekerjaan% 1 seperti yang dikatakan bash)fg
akan mengembalikannya.Ctrl+Z
bukan cara yang tepat untuk menghentikan skrip python dan harus dihindari kecuali Anda berencana melanjutkan proses yang dijeda.Proses interupsi tergantung pada perangkat keras dan OS. Jadi Anda akan memiliki perilaku yang sangat berbeda tergantung di mana Anda menjalankan skrip python Anda. Misalnya, pada mesin Windows kami memiliki Ctrl+ C(
SIGINT
) dan Ctrl+ Break(SIGBREAK
).Jadi, sementara SIGINT hadir pada semua sistem dan dapat ditangani dan ditangkap, sinyal SIGBREAK khusus untuk Windows (dan dapat dinonaktifkan di CONFIG.SYS ) dan benar-benar ditangani oleh BIOS sebagai vektor interupsi INT 1Bh , itulah sebabnya kunci ini jauh lebih kuat daripada yang lain. Jadi jika Anda menggunakan beberapa OS beraroma * nix, Anda akan mendapatkan hasil yang berbeda tergantung pada implementasinya, karena sinyal itu tidak ada di sana, tetapi yang lain juga. Di Linux Anda dapat memeriksa sinyal apa yang tersedia untuk Anda dengan:
Jadi jika Anda ingin menangkap
CTRL+BREAK
sinyal pada sistem linux, Anda harus memeriksa sinyal POSIX apa yang telah dipetakan kunci tersebut. Pemetaan populer adalah:Bahkan, banyak fungsi lagi yang tersedia di Linux, di mana SysRq(System Request) kunci dapat mengambil kehidupan sendiri ...
sumber
Posting ini sudah tua tetapi saya baru-baru ini mengalami masalah yang sama yaitu Ctrl+ Ctidak menghentikan skrip Python di Linux. Saya menggunakan Ctrl+ \(
SIGQUIT
).sumber
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.join
atau menunggu respons web. Namun itu berhasiltime.sleep
. Inilah penjelasan yang bagus tentang apa yang terjadi pada interpreter Python. Perhatikan bahwa Ctrl+ CmenghasilkanSIGINT
.Solusi 1: Gunakan Ctrl+ Breakatau Setara
Gunakan pintasan keyboard di bawah ini di jendela terminal / konsol yang akan menghasilkan
SIGBREAK
pada level yang lebih rendah di OS dan menghentikan interpreter Python.Mac OS dan Linux
Ctrl+ Shift+ \atau Ctrl+\
Windows :
Solusi 2: Gunakan Windows API
Di bawah ini adalah fungsi praktis yang akan mendeteksi Windows dan menginstal custom handler untuk Ctrl+ Cdi konsol:
Anda dapat menggunakan di atas seperti ini:
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
sumber
ctrl + c
tidak berhenti tetapi menunjukkanKeyboardInterrupt
.Pada Mac, tekan Ctrl+ \untuk keluar dari proses python yang terpasang pada terminal.
sumber
Di mac / di Terminal:
sumber
Itu mungkin membantu.
sumber
Anda dapat membuka task manager Anda (ctrl + alt + delete, kemudian pergi ke task manager) dan melihatnya melalui python dan server dipanggil (sebagai contoh) _go_app (konvensi penamaan adalah: _language_app).
Jika saya mengakhiri tugas _go_app itu akan mengakhiri server, jadi pergi ke sana di browser akan mengatakan itu "tiba-tiba berakhir", saya juga menggunakan git bash, dan ketika saya memulai server, saya tidak bisa keluar dari server di shell bash dengan ctrl + c atau ctrl + pause, tetapi setelah Anda mengakhiri tugas python (yang menggunakan 63,7 mb) itu akan keluar dari skrip server di bash, dan izinkan saya untuk menggunakan shell git bash.
sumber
Sebagai catatan, apa yang membunuh proses pada Raspberry 3B + saya (menjalankan raspbian) adalah Ctrl+ '. Pada keyboard AZERTY Prancis saya, sentuhannya 'juga nomor 4.
sumber