2012-01-13 138 views
1

我想从这里使用下面的代码: How can I save all the variables in the current python session?搁置代码给出KeyError异常

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

但它提供了以下错误:

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' 

你能帮助我吗?

谢谢!

+3

明显'全局()'和'目录()'是不是一回事,为什么你要循环一个,并索引另一个? – 2012-01-13 22:10:29

回答

2

从你的回溯看来,你似乎试图从一个函数内运行该代码。

但是dir当前的本地范围中查找名称。因此,如果在函数内部定义了filename,它将在locals()而不是globals()

你可能想更多的东西是这样的:

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

注意,当globals()距离功能从调用,它返回从那里的功能是定义,而不是从哪里模块变量它的叫做

因此,如果save_variables功能是进口的,你想从当前模块中的变量,然后执行:

save_variables(globals())