在程序终止或PC关机时调用函数
我的问题是:
我想在程序结束或者电脑关机的时候调用一个函数。
我在网上查了一下,发现了一个叫 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:~ $