Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在程序终止或pc关闭时调用函数_Python_Python 2.7 - Fatal编程技术网

Python 在程序终止或pc关闭时调用函数

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) 如果重新编译注释部分,它会起作用,但这不是我想要的。当所有代码都执行时,而不是

我的问题是,

我想在程序终止或计算机关闭时调用函数

我确实在网上搜索过,我找到了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)
如果重新编译注释部分,它会起作用,但这不是我想要的。当所有代码都执行时,而不是在终止或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,您只需捕获正确的信号,即可在计算机关闭时运行该功能。但它无法正常工作。我不知道这可能是不可能的:(