为啥 atexit 不在 python 中注册?

Posted

技术标签:

【中文标题】为啥 atexit 不在 python 中注册?【英文标题】:Why isn't atexit registering in python?为什么 atexit 不在 python 中注册? 【发布时间】:2013-03-10 18:11:55 【问题描述】:

我在 Tkinter 中有一个循环:

def main():
    #Global Variables
    windows = []
    buttons = []
    labels = []
    messageboxes = []
    global theme
    theme = 0
    listboxes = []
    global register
    register = []
    global path
    path = ""
    # Lotsa' Code
    Tkinter.mainloop()

if __name__ == "__main__":
    main()

def save_f():
    global register
    outFile = open('FobbySave.txt', 'wb')
    pickle.dump(register, outFile)
    outFile.close()
global register     
#At Quit
atexit.register(save_f)

atexit 失败。但是当我尝试打印寄存器时它没有问题。当我将 save_f 放入 Tkinter 循环时,它起作用了,但 atexit 没有。那么有人可以告诉我我做错了什么吗?

附言

抱歉,第一次忘记写 atexit。但它在我的代码中。

编辑:这里的原始代码

import pickle
import atexit
def save_f():
    global register
    outFile = open('Something.txt', 'wb')
    pickle.dump(register, outFile)
    outFile.close()
atexit.register(save_f)

【问题讨论】:

为我工作...您尚未在示例中导入 atexit ... 【参考方案1】:

好吧,问题是我需要atexit.register(save_f) 而不是atexit.register(save_f())

你不应该进行函数调用!

【讨论】:

【参考方案2】:

查看您的代码,我建议您尝试一下:

def main():
    # ... everything in main ...
    Tkinter.mainloop()

def save_f():
    outFile = open('FobbySave.txt', 'wb')
    pickle.dump(register, outFile)
    outFile.close()

#At Quit
atexit.register(save_f)

if __name__ == "__main__":
    main()

问题可能是您在运行 main 方法后初始化了 atexit。因此,在代码被终止(并停止执行)后,您尝试添加 atexit 方法。

【讨论】:

注册是一个列表。有问题吗? @madprogramer:只要你能pickle注册就可以了。但是,如果列表中的某些内容不是泡菜安全的,那么它就不起作用了。 现在我可以通过在解释器中输入 save_f 来保存。但它不会自动工作。这是我的基本列表:register = [[theme,'theme']] theme 的值是多少?也许你不能腌制它? 如果你只是在脚本底部(就在退出之前)添加一个“save_f()”,你会得到什么结果?【参考方案3】:

只要我import atexit 并将register 设置为某些东西,您的基本脚本就可以使用。例如:

import pickle
import atexit

def save_f():
    outFile = open('Something.txt', 'wb')
    pickle.dump(register, outFile)
    outFile.close()

register = 1
atexit.register(save_f)

(请注意,global 也不是必需的)。在这种情况下,您应该确保在当前目录或您的PYTHONPATH 上的其他位置没有另一个名为atexit.py 的文件...

【讨论】:

这只是部分代码。其他地方引用了寄存器。 @madprogramer -- 你说“atexit 不能注册它”。你是什​​么意思?它会引发异常吗? 它什么也没做。也不例外。 @madprogramer -- 你的脚本是如何退出的?如果你使用os._exit,那么atexit注册的任何函数都不会运行... 我只用了atexit,还有什么原因?

以上是关于为啥 atexit 不在 python 中注册?的主要内容,如果未能解决你的问题,请参考以下文章

Python atexit模块

是否可以更改使用 atexit() 注册的函数中的退出代码?

Python 装饰器(Decorator)

为啥 Thread.Sleep 不在秒表中注册?

atexit函数和两种特殊文件权限位

Linux - atexit()(注册终止)函数