Атексит не регистрируется в питоне

Оказывается, проблема была другой Теперь у меня есть цикл в 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)

3 ответа

Решение

ОК, оказывается, проблема была в том, что мне нужно atexit.register(save_f) вместо atexit.register(save_f()),

Вы не должны делать вызов функции!

Вы основной сценарий работает для меня, если я 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 тоже не обязательно). В этих случаях вы должны убедиться, что у вас нет другого файла с именем atexit.py в текущем каталоге или где-то еще на вашем PYTHONPATH ...

Глядя на ваш код, я бы предложил вместо этого попробовать:

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()

Возможно, проблема в том, что вы инициализируете atexit после запуска основного метода. Таким образом, после того, как код убит (и прекращает выполнение), вы пытаетесь добавить atexit метод.

Другие вопросы по тегам