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