2013-07-13 24 views
0

如果在程序关闭之前有一种方法可以执行某个动作,我就会徘徊。我正在运行一个程序很长一段时间,我确实希望能够关闭它,并将数据保存在文本文件中,但是我没有办法干涉我正在运行的while True循环,并且只保存每个循环的数据将非常无效。在意外退出时执行一个动作python

那么,有没有办法,我可以保存数据,说一个列表中,当我打x或破坏的程序?我一直在看atexit模块,但没有运气,除非我在某个时间点完成程序。

​​

这是我的代码的整体atexit一部分,就像我说的,当我把它通过while loop关闭它运行良好。

这是可能的,当应用程序被终止保存的东西吗?

+0

您应该注册一个SIGINT处理程序:http://stackoverflow.com/q/1112343/624900 – jterrace

+0

当一个程序被杀死后,它在死亡之前无法做任何事情。更好的是你提供了一些常规终止的用户界面 –

+2

@MichaelButscher取决于kill的类型,SIGINT和SIGTERM可以被捕获,SIGKILL不能被捕获 – jterrace

回答

5

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

atexit.register(saveFile, list) 

请注意,这里使用了list参考,因为它存在于你叫atexit.register()的时间,因此,如果您分配给list后,这些更改将不会被拾起。虽然修改列表本身而不重新分配应该没问题。

+0

它不再在退出时调用该函数。该计划刚刚结束。什么都没发生。 – ReallyGoodPie

+0

你如何停止该计划? – Thomas

+0

只需点击命令行窗口中的“x”按钮。有没有另外一种方法可以在代码中做到这一点? – ReallyGoodPie

2

赶上在应用程序的顶部SystemExit异常,然后重新抛出。

4

您可以使用handle_exit情况管理器从这个ActiveState的食谱:

http://code.activestate.com/recipes/577997-handle-exit-context-manager/

它处理SystemExitKeyboardInterruptSIGINTSIGTERM,一个简单的界面:

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

def main(): 
    print 'do something' 

if __name__ == '__main__': 
    with handle_exit(cleanup): 
     main() 

没有什么您可以响应SIGKILL。它立即杀死你的进程,没有任何清理。

0

这里有几个方法可供选择。正如有人评论说你可以使用信号处理...你的[Ctrl] + [C]从这是在前台运行的终端正在调度SIGHUP信号到您的进程(从终端的驱动程序) 。

另一种方法是使用非阻塞os.read()sys.stdin.fileno这样你查询你的键盘每一个循环中,看看是否“退出”按键或序列已被输入。

可以使用模块的功能来实现类似的非阻塞轮询方法。我已经看到,与termiostty模块使用。(似乎不雅,它需要所有那些来保存,设置更改,并恢复终端设置,我也看到一些使用osfcntl的例子;我不知道什么时候或为什么更喜欢一个在另一个,如果os.isatty(sys.stdin.fileno()))。

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