Apakah ada cara Python untuk menangkap KeyboardInterrupt
acara tanpa memasukkan semua kode di dalam try
-except
pernyataan ?
Saya ingin keluar dengan bersih tanpa jejak jika pengguna menekan Ctrl+ C.
Apakah ada cara Python untuk menangkap KeyboardInterrupt
acara tanpa memasukkan semua kode di dalam try
-except
pernyataan ?
Saya ingin keluar dengan bersih tanpa jejak jika pengguna menekan Ctrl+ C.
Ya, Anda dapat menginstal sebuah interrupt handler menggunakan modul sinyal , dan menunggu selamanya menggunakan threading.Event :
import signal
import sys
import time
import threading
def signal_handler(signal, frame):
print('You pressed Ctrl+C!')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print('Press Ctrl+C')
forever = threading.Event()
forever.wait()
while True: continue
. (Dengan gaya itu,while True: pass
akan lebih rapi.) Itu akan sangat boros; cobalah sesuatu sepertiwhile True: time.sleep(60 * 60 * 24)
(tidur selama sehari pada suatu waktu adalah gambaran yang sepenuhnya sewenang-wenang).time
(sebagaimana mestinya), jangan lupaimport time
:)Jika yang Anda inginkan hanyalah tidak menampilkan traceback, buat kode Anda seperti ini:
(Ya, saya tahu bahwa ini tidak secara langsung menjawab pertanyaan, tetapi tidak terlalu jelas mengapa membutuhkan blok coba / kecuali tidak menyenangkan - mungkin ini membuatnya kurang mengganggu bagi OP)
sumber
signal.signal( signal.SIGINT, lambda s, f : sys.exit(0))
selalu begitu.Alternatif untuk menyetel penangan sinyal Anda sendiri adalah dengan menggunakan pengelola konteks untuk menangkap pengecualian dan mengabaikannya:
Ini menghapus blok
try
-except
sambil tetap mempertahankan beberapa penyebutan eksplisit tentang apa yang sedang terjadi.Ini juga memungkinkan Anda untuk mengabaikan interupsi hanya di beberapa bagian kode Anda tanpa harus mengatur dan mengatur ulang penangan sinyal lagi setiap saat.
sumber
Saya tahu ini adalah pertanyaan lama tetapi saya datang ke sini lebih dulu dan kemudian menemukan
atexit
modulnya. Saya belum tahu tentang rekam jejak lintas platformnya atau daftar lengkap peringatannya, tetapi sejauh ini persis seperti yang saya cari dalam mencoba menangani pascaKeyboardInterrupt
pembersihan di Linux. Hanya ingin membuang cara lain untuk mendekati masalah.Saya ingin melakukan pembersihan pasca keluar dalam konteks operasi Fabric, jadi membungkus semuanya
try
/except
juga bukan pilihan bagi saya. Saya merasaatexit
mungkin cocok untuk situasi seperti itu, di mana kode Anda tidak berada di tingkat atas aliran kontrol.atexit
sangat mampu dan mudah dibaca, misalnya:Anda juga dapat menggunakannya sebagai dekorator (mulai 2.6; contoh ini dari dokumen):
Jika Anda ingin membuatnya spesifik
KeyboardInterrupt
, jawaban orang lain untuk pertanyaan ini mungkin lebih baik.Tapi perhatikan bahwa file
atexit
modul ini hanya terdiri dari ~ 70 baris kode dan tidak akan sulit untuk membuat versi serupa yang memperlakukan pengecualian secara berbeda, misalnya meneruskan pengecualian sebagai argumen ke fungsi callback. (Batasanatexit
itu akan menjamin versi yang dimodifikasi: saat ini saya tidak dapat membayangkan cara agar fungsi exit-callback mengetahui tentang pengecualian;atexit
penangan menangkap pengecualian, memanggil callback Anda, lalu memunculkan kembali pengecualian itu. Tetapi Anda dapat melakukan ini secara berbeda.)Untuk info lebih lanjut lihat:
atexit
sumber
Anda dapat mencegah pencetakan jejak tumpukan untuk
KeyboardInterrupt
, tanpatry: ... except KeyboardInterrupt: pass
(solusi "terbaik" yang paling jelas dan mungkin, tetapi Anda sudah mengetahuinya dan meminta sesuatu yang lain) dengan menggantisys.excepthook
. Sesuatu sepertisumber
Saya mencoba solusi yang disarankan oleh semua orang, tetapi saya harus mengimprovisasi kode sendiri untuk benar-benar membuatnya berfungsi. Berikut adalah kode improvisasi saya:
sumber
Jika seseorang mencari solusi minimal yang cepat,
sumber