Question

Je voulais utiliser le code suivant à partir d'ici: Comment puis-je enregistrer toutes les variables la session python actuelle?

import shelve

T='Hiya'
val=[1,2,3]

filename='/tmp/shelve.out'
my_shelf = shelve.open(filename,'n') # 'n' for new

for key in dir():
    try:
        my_shelf[key] = globals()[key]
    except TypeError:
        #
        # __builtins__, my_shelf, and imported modules can not be shelved.
        #
        print('ERROR shelving: {0}'.format(key))
my_shelf.close()

Mais il donne l'erreur suivante:

Traceback (most recent call last):
  File "./bingo.py", line 204, in <module>
    menu()
  File "./bingo.py", line 67, in menu
    my_shelf[key] = globals()[key]
KeyError: 'filename'

Pouvez-vous me aider s'il vous plaît?

Merci!

Était-ce utile?

La solution

De votre retraçage, il semble que vous essayez d'exécuter ce code à l'intérieur d'une fonction.

Mais regarde les noms dir dans le portée locale actuelle . Donc, si filename est défini dans la fonction, il sera en locals() plutôt que < a href = "http://docs.python.org/library/functions.html#globals" rel = "nofollow"> globals() .

Vous voulez probablement quelque chose comme ceci:

import shelve

T = 'Hiya'
val = [1, 2, 3]

def save_variables(globals_=None):
    if globals_ is None:
        globals_ = globals()
    filename = '/tmp/shelve.out'
    my_shelf = shelve.open(filename, 'n')
    for key, value in globals_.items():
        if not key.startswith('__'):
            try:
                my_shelf[key] = value
            except Exception:
                print('ERROR shelving: "%s"' % key)
            else:
                print('shelved: "%s"' % key)
    my_shelf.close()

save_variables()

Notez que lorsque globals() est appelé à partir de dans les la fonction, il retourne les variables à partir du module où la fonction est défini , pas de là où elle est appelé .

Donc, si la fonction save_variables est importée, et que vous voulez les variables de la courant module, puis faites:

save_variables(globals())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top