Pregunta

Quería usar el siguiente código de aquí:¿Cómo puedo guardar todas las variables en la sesión actual de 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()

Pero da el siguiente error:

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'

¿Puedes ayudarme por favor?

¡Gracias!

¿Fue útil?

Solución

Desde su traza, parece que está tratando de ejecutar ese código desde dentro de una función.

Pero dir mira los nombres en el alcance local actual. Así que si filename se define dentro de la función, estará en locals() más bien que globals().

Probablemente quieras algo más como esto:

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

Tenga en cuenta que cuando globals() se llama desde dentro de la función, devuelve las variables del módulo donde está la función definido, no de donde está llamó.

Entonces si el save_variables la función se importa y desea las variables del Actual módulo, luego hacer:

save_variables(globals())
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top