2012-01-13 48 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())