Python 在程序终止或pc关闭时调用函数
我的问题是, 我想在程序终止或计算机关闭时调用函数 我确实在网上搜索过,我找到了atexit,这里是一个示例程序,可以清楚地告诉我想要什么Python 在程序终止或pc关闭时调用函数,python,python-2.7,Python,Python 2.7,我的问题是, 我想在程序终止或计算机关闭时调用函数 我确实在网上搜索过,我找到了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) 如果重新编译注释部分,它会起作用,但这不是我想要的。当所有代码都执行时,而不是
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)
如果重新编译注释部分,它会起作用,但这不是我想要的。当所有代码都执行时,而不是在终止或pc关闭时,它会打印“再见”
我希望它是清楚的,提前谢谢
Python 2.7
Win 8 64请注意,
atexit
函数在程序中断时不被调用,只有在程序正常完成时才被调用。更具体地说,从文档:
这样注册的函数在正常运行时自动执行
解释器终止
您需要使用信号
模块捕捉正确的信号
$ 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时发送的
请注意,如果没有退出(1)命令,程序将不会被Ctrl+C终止:
我需要在这里发送另一个信号(SIGSTOP)来停止它
点击Ctrl+C后,将显示Goodby消息。您可以对SIGTERM执行相同的操作,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:~ $
请注意,
atexit
程序中断时不会调用函数,只有在程序正常完成时才会调用。更具体地说,从文档:
这样注册的函数在正常运行时自动执行
解释器终止
您需要使用信号
模块捕捉正确的信号
$ 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时发送的
请注意,如果没有退出(1)命令,程序将不会被Ctrl+C终止:
我需要在这里发送另一个信号(SIGSTOP)来停止它
点击Ctrl+C后,将显示Goodby消息。您可以对SIGTERM执行相同的操作,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:~ $
为什么不在循环开始前注册?它不会改变任何东西。:S(我试着确定)为什么不在循环开始前注册?它不会改变任何东西。:S(我试着确定)哼,刚才注意到问题末尾的小“Win 8 64”。我刚刚在Linux上测试过,但它应该与Windows的工作方式类似。它只适用于ctrl+C,我的意思是,我运行一个程序,然后关闭电脑。它还能工作吗?你需要试试它,因为我无法访问Win 8电脑。但是,正如我回答的第二部分所指出的,当计算机关闭时,您只需捕捉正确的信号即可运行该功能,但它无法正常工作。我不知道也许这是不可能的:(嗯,刚才在问题的末尾提到了小的‘Win 8 64’。我刚刚在Linux上测试了它,但它应该在Windows上也能工作。它只在ctrl+C下工作。我的意思是,我运行一个程序,然后关闭电脑。它还能工作吗?你需要尝试一下,因为我没有访问Win 8计算机的权限。但是,作为我回答的第二部分,我指出ates,您只需捕获正确的信号,即可在计算机关闭时运行该功能。但它无法正常工作。我不知道这可能是不可能的:(