📜  如何在 python 中捕获 ctrl c(1)

📅  最后修改于: 2023-12-03 15:24:20.030000             🧑  作者: Mango

如何在 Python 中捕获 Ctrl+C

在 Python 中,我们可以通过 signal 模块来捕获信号。Ctrl+C 是一个终止进程的信号,也称为 SIGINT。

下面将介绍如何在 Python 中捕获 Ctrl+C 信号,以及在信号处理函数中做一些清理工作。

捕获 Ctrl+C 信号

我们可以使用 signal 模块中的 signal 方法来注册信号处理函数,示例代码如下:

import signal
import time

def signal_handler(signal, frame):
    print('You pressed Ctrl+C!')
    exit(0)

signal.signal(signal.SIGINT, signal_handler)
while True:
    print('Press Ctrl+C')
    time.sleep(1)

这段程序运行后,会持续输出 Press Ctrl+C,当我们按下 Ctrl+C 后,会输出 You pressed Ctrl+C! 并结束程序。

在上述代码中,我们定义了一个 signal_handler 函数作为信号处理函数,并使用 signal.SIGINT 注册了 Ctrl+C 信号的处理函数。当接收到 Ctrl+C 信号时,我们执行自定义的信号处理函数,打印一句话并结束程序。

信号处理函数中的清理工作

在信号处理函数中,我们可以编写一些程序清理工作,以避免进程意外终止时出现问题。例如,我们可以关闭一些正在运行的线程,保存临时文件,或者发送一些日志信息。

下面是一个做清理工作的例子:

import signal
import time
import threading

def signal_handler(signal, frame):
    print('You pressed Ctrl+C!')
    print('Closing threads...')
    threads = threading.enumerate()
    for thread in threads:
        if thread != threading.current_thread():
            thread.stop()
    exit(0)

signal.signal(signal.SIGINT, signal_handler)

class MyThread(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):
        while True:
            print('{} is running...'.format(self.name))
            time.sleep(1)

t1 = MyThread('thread1')
t2 = MyThread('thread2')
t1.start()
t2.start()
while True:
    print('Press Ctrl+C')
    time.sleep(1)

在上述代码中,我们定义了两个线程 t1t2,然后在信号处理函数中关闭这两个线程。当我们按下 Ctrl+C 时,程序会输出 You pressed Ctrl+C! 并关闭正在运行的线程。

结语

通过 signal 模块,我们可以很容易地捕获 Ctrl+C 信号,并在信号处理函数中做清理工作。这有助于我们避免进程在意外终止时造成问题。