0

如果有办法在程序关闭之前执行某项操作,我正在徘徊。我正在运行一个程序很长时间,我确实希望能够关闭它并将数据保存在文本文件或其他东西中,但是我无法干扰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 loop.

这有可能在应用程序终止时保存一些东西吗?

4

4 回答 4

5

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

atexit.register(saveFile, list)

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

于 2013-07-13T18:57:26.977 回答
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. 它会立即终止您的进程,而无需进行任何允许的清理。

于 2013-07-13T18:16:21.020 回答
2

SystemExit在应用程序顶部捕获异常,然后重新抛出它。

于 2013-07-13T18:04:58.590 回答
0

有几种方法可以解决这个问题。正如一些人评论的那样,您可以使用信号处理......您的[Ctrl]+[C]来自在前台运行的终端正在向您的进程发送SIGHUP信号(来自终端的驱动程序)。

另一种方法是使用非阻塞os.read()方式sys.stdin.fileno,以便您在每个循环期间轮询键盘,以查看是否输入了“退出”击键或序列。

select使用模块的功能可以实现类似的非阻塞轮询方法。我已经看到与termiosandtty模块一起使用。(似乎不优雅,它需要所有这些来保存、设置更改和恢复终端设置,而且我还看到了一些使用osand的示例fcntl;我不确定何时或为什么一个人会更喜欢一个而不是另一个os.isatty(sys.stdin.fileno())) .

另一种方法是将curses模块与window.nodelay()window.timeout()设置您想要的输入行为,然后或者window.getch()window.getkey()轮询任何输入。

于 2013-07-14T04:58:20.367 回答