在程序终止或PC关机时调用函数

1 投票
1 回答
694 浏览
提问于 2025-04-19 16:22

我的问题是:

我想在程序结束或者电脑关机的时候调用一个函数。

我在网上查了一下,发现了一个叫 atexit 的东西,这里有一个示例程序,可以更清楚地说明我想要的效果。

import atexit
a = 1
b = 0
while a==1:
    b += 1
    #if b=30: 
        #a=2
def say_bye():
    print " Goodbye "

atexit.register(say_bye)

如果我把注释部分去掉,它是可以工作的,但这不是我想要的。它是在所有代码执行完后打印“再见”,而不是在程序结束或电脑关机时打印。

我希望这样说清楚了,提前谢谢大家。

Python 2.7
Win 8 64

1 个回答

4

需要注意的是,atexit 函数在程序被中断时不会被调用,只有在程序正常结束时才会被执行。具体来说,文档中提到:

这样注册的函数会在解释器正常终止时自动执行。

你需要用 signal 模块来捕捉正确的信号。

$ cat t.py 
import signal


def say_bye(signum, frame):
    print " Goodbye "
    exit(1)

signal.signal(signal.SIGINT, say_bye)

a = 1
b = 0
while a==1:
    b += 1

这个程序启动了一个无限循环,但它注册了一个信号处理器,用来处理 SIGINT 信号,也就是当用户按下 Ctrl + C 时发送的信号。

$ python t.py 
^C Goodbye 
$ 

注意,如果没有 exit(1) 这个命令,程序不会因为按下 Ctrl + C 而终止:

$ python t.py
^C Goodbye 
^C Goodbye 
^C Goodbye 
^C Goodbye 
^Z
[1]+  Stopped                 python t.py

在这种情况下,我需要发送另一个信号(SIGSTOP)来停止它。

当我按下 Ctrl + C 时,会显示“再见”的消息。你也可以用 SIGTERM 信号来做到这一点,这个信号是通过 kill 命令发送的:

$ cat t.py 
import signal


def say_bye(signum, frame):
    print " Goodbye "
    exit(1)

signal.signal(signal.SIGTERM, say_bye)

a = 1
b = 0
while a==1:
    b += 1

上面的代码输出:

$ python t.py & PID=$! ; sleep 1 && kill $PID
[1] 94883
 Goodbye 
[1]+  Exit 1                  python t.py
francois@macdam:~ $ 

撰写回答