Shelve代码出现KeyError错误

3 投票
1 回答
3937 浏览
提问于 2025-04-17 10:12

我想使用下面的代码,来自这里:

如何保存当前Python会话中的所有变量?

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'

你能帮我吗?

谢谢!

1 个回答

4

从你的错误信息来看,你似乎是在一个函数内部运行那段代码。

但是,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())

撰写回答