Python 在意外退出时执行操作

Python 在意外退出时执行操作,python,terminate,Python,Terminate,我在想是否有办法在程序关闭前执行操作。我正在运行一个程序很长时间,我确实希望能够关闭它,并将数据保存在文本文件或其他文件中,但我无法干扰正在运行的while True循环,仅在每个循环中保存数据将非常无效 那么,当我点击x或销毁程序时,有没有一种方法可以保存数据,比如列表?我一直在看atexit模块,但除了将程序设置为在某个点完成外,运气不好 def saveFile(list): print "Saving List" with open("file.txt", "a") as

我在想是否有办法在程序关闭前执行操作。我正在运行一个程序很长时间,我确实希望能够关闭它,并将数据保存在文本文件或其他文件中,但我无法干扰正在运行的while True循环,仅在每个循环中保存数据将非常无效

那么,当我点击x或销毁程序时,有没有一种方法可以保存数据,比如列表?我一直在看atexit模块,但除了将程序设置为在某个点完成外,运气不好

def saveFile(list):
    print "Saving List"
    with open("file.txt", "a") as test_file:
        test_file.write(str(list[-1]))

atexit.register(saveFile(list))
这就是代码的整个atexit部分,正如我所说的,当我将其设置为通过while循环关闭时,它运行良好

是否可以在应用程序终止时保存某些内容?

捕获应用程序顶部的SystemExit异常,然后重新显示它。

您可以使用此ActiveState配方中的句柄退出上下文管理器:

它通过一个简单的接口处理SystemExit、KeyboardInterrupt、SIGINT和SIGTERM:

def cleanup():
    print 'do some cleanup here'

def main():
    print 'do something'

if __name__ == '__main__':
    with handle_exit(cleanup):
        main()
没有什么能对SIGKILL做出反应。它会立即终止您的进程,而不进行任何允许的清理。

您的atexit使用是错误的。它需要一个函数及其参数,但您只需立即调用函数并将结果传递给atexit.register。尝试:


请注意,这将使用调用atexit.register时存在的列表引用,因此,如果您在调用atexit.register后将其分配给列表,则这些更改将不会被拾取。不过,在不重新分配的情况下修改列表本身应该没问题。

有几种方法可以做到这一点。正如一些人评论的那样,您可以使用信号处理。。。您的[Ctrl]+[C]来自在前台运行该命令的终端,正在从终端的驱动程序向您的进程发送SIGHUP信号

另一种方法是在sys.stdin.fileno上使用非阻塞os.read,以便在每次循环中轮询键盘,查看是否输入了退出击键或序列

可以使用select模块的功能实现类似的非阻塞轮询方法。我看到它与termios和tty模块一起使用。似乎不雅观的是,它需要所有这些来保存、设置更改和恢复终端设置,我还看到了一些使用os和fcntl的示例;如果os.isattysys.stdin.fileno,我不知道什么时候或者为什么一个人会喜欢一个而不是另一个


另一种方法是使用带有window.nodelay或window.timeout的curses模块来设置所需的输入行为,然后使用window.getch或window.getkey来轮询任何输入。

您应该注册一个SIGINT处理程序:当程序被终止时,它在终止之前无法执行任何操作。您最好为常规用户提供一些用户界面termination@MichaelButscher取决于杀死的类型,可以捕获SIGINT和SIGTERM,SIGKILL不能捕获t@jterrace从问题的内容来看,我认为他指的是一个SIGKILL,但我应该说清楚,它不再在退出时调用函数。节目刚刚结束。什么也没发生。你是如何停止程序的?只需点击命令行窗口上的x按钮。是否有其他方法可以从代码中执行此操作?
atexit.register(saveFile, list)