Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menangkap isyarat penamatan Ctrl+C dalam Python3

Bagaimana untuk menangkap isyarat penamatan Ctrl+C dalam Python3

WBOY
WBOYke hadapan
2023-05-21 13:46:321857semak imbas

Latar Belakang Teknikal

Aturcara Python yang berjalan lama, seperti bahagian belakang pelayan atau program pengkomputeran saintifik, memerlukan perhatian khusus. Apabila melakukan operasi tertentu, seperti menggunakan Ctrl+C untuk menamatkan program yang sedang berjalan, kita mungkin perlu menamatkannya lebih awal. Biasanya, terdapat dua kemungkinan untuk situasi ini: satu ialah program mempunyai ralat dan program perlu dihentikan untuk pelarasan. Yang lain ialah program itu sendiri adalah betul, tetapi program berjalan terlalu perlahan, atau ia mungkin mahu ditamatkan lebih awal Dalam senario ini, kami sering berharap untuk mengekalkan hasil pengiraan yang sepadan. Walau bagaimanapun, jika kami menggunakan beberapa format storan data pihak ketiga untuk menyimpan data, ia mungkin tidak menyokong storan berterusan Ia adalah perkara biasa untuk menyimpan keputusan selepas pelaksanaan program selesai. Jika program ditamatkan pada pertengahan jalan, cara khas diperlukan untuk menyimpan keputusannya.

Kes Asas

Mula-mula kita lihat kes yang agak mudah: program biasa yang mencetak nombor, yang mencetak nombor setiap 1 saat Kita boleh menggunakan isyarat ular sawa untuk menangkap isyarat penamatan ini .

# signal_exit.py
import signal
import sys
 
def signal_handler(signal, frame):
    print ('\nSignal Catched! You have just type Ctrl+C!')
    sys.exit(0)
 
if __name__ == '__main__':
    import time
 
    signal.signal(signal.SIGINT, signal_handler)
    for x in range(100):
        time.sleep(1)
        print (x)

Apabila kita separuh jalan menjalankan program ini dan tekan Ctrl+C pada masa yang sama, kita akan mendapat keputusan berikut:

$ python3 signal_exit.py
0
1
2
^C
Isyarat Ditangkap! Anda baru sahaja menaip Ctrl+C!

Hasil ini menunjukkan bahawa kami menangkap Ctrl+C semasa menjalankan program Operasi luaran ini dilakukan dan operasi diproses dengan sewajarnya sebelum program ditamatkan. Perlu diingatkan bahawa jika operasi penamatan sys.exit(0) tidak ditambahkan pada masa ini, program tidak akan dihentikan dan akan terus berjalan, yang bersamaan dengan menangkap isyarat penamatan yang tidak normal tetapi tidak melakukan sebarang pemprosesan.

Lepaskan parameter luaran kepada isyarat penamatan

Dalam kes di atas, kami hanya menangkap isyarat luaran "menamatkan larian", tetapi jika kami pergi lebih jauh, kami mahu menangkapnya ke tamat Apakah nombor output, dan bagaimana untuk mengendalikannya pada masa ini? Fungsi signal.signal itu sendiri tidak menyokong lulus banyak parameter Pada masa ini, adalah disyorkan untuk membuat kelas sendiri dan merangkum fungsi signal_handler sebagai fungsi ahli kelas, supaya kita boleh mendapatkan parameter dalaman yang sepadan. , seperti kes berikut Seperti yang ditunjukkan:

# signal_exit.py
import signal
import sys
import time
 
class Printer:
    def __init__(self):
        self.x = 0
        signal.signal(signal.SIGINT, self.signal_handler)
 
    def signal_handler(self, signal, frame):
        print ('\nSignal Catched! You have just type Ctrl+C! The last number is: {}'.format(self.x))
        sys.exit(0)
 
    def run(self, counter=10):
        while self.x < counter:
            print (self.x)
            time.sleep(1)
            self.x += 1
 
if __name__ == &#39;__main__&#39;:
    printer = Printer()
    printer.run(counter=100)

Pada masa ini, jika anda menekan Ctrl+C pada masa yang sama semasa program sedang berjalan, hasilnya akan seperti berikut:

$ python3 signal_exit.py
0
1
2
3
^C
Isyarat Ditangkap! >

Seperti yang anda lihat, Kami berjaya menangkap parameter keluaran terakhir.

Atas ialah kandungan terperinci Bagaimana untuk menangkap isyarat penamatan Ctrl+C dalam Python3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam