Как я могу сохранить все переменные в текущем сеансе python?
Я хочу сохранить все переменные в моей текущей среде python. Кажется, один из вариантов-использовать модуль "рассол". Однако я не хочу этого делать по двум причинам:
1) я должен позвонить рассол.дамп() для каждой переменной
2) Когда я хочу получить переменные, я должен помнить порядок, в котором я сохранил переменные, а затем сделать рассол.load () для извлечения каждой переменной.
Я ищу какую-то команду, которая бы сохранила всю сессию, поэтому что когда я загружаю этот сохраненный сеанс, все мои переменные восстанавливаются. Это возможно?
Спасибо большое!
Гаурав
Edit: я думаю, я не против позвонить рассолу.дамп () для каждой переменной, которую я хотел бы сохранить, но запоминание точного порядка, в котором были сохранены переменные, кажется большим ограничением. Я хочу избежать этого.
7 ответов:
Если вы используете shelve, вам не нужно запоминать порядок, в котором объекты маринуются, так как
shelve
дает вам словарь-объект:чтобы отложить свою работу:
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()
восстановить:
my_shelf = shelve.open(filename) for key in my_shelf: globals()[key]=my_shelf[key] my_shelf.close() print(T) # Hiya print(val) # [1, 2, 3]
сидя здесь и не удалось спасти
globals()
как словарь, я обнаружил, что вы можете мариновать сеанс, используя библиотеку укропа.Это можно сделать с помощью:
import dill #pip install dill --user filename = 'globalsave.pkl' dill.dump_session(filename) # and to load the session again: dill.load_session(filename)
вот способ сохранения переменных рабочего пространства Spyder с помощью функций spyderlib
#%% Load data from .spydata file from spyderlib.utils.iofuncs import load_dictionary globals().update(load_dictionary(fpath)[0]) data = load_dictionary(fpath) #%% Save data to .spydata file from spyderlib.utils.iofuncs import save_dictionary def variablesfilter(d): from spyderlib.widgets.dicteditorutils import globalsfilter from spyderlib.plugins.variableexplorer import VariableExplorer from spyderlib.baseconfig import get_conf_path, get_supported_types data = globals() settings = VariableExplorer.get_settings() get_supported_types() data = globalsfilter(data, check_all=True, filters=tuple(get_supported_types()['picklable']), exclude_private=settings['exclude_private'], exclude_uppercase=settings['exclude_uppercase'], exclude_capitalized=settings['exclude_capitalized'], exclude_unsupported=settings['exclude_unsupported'], excluded_names=settings['excluded_names']+['settings','In']) return data def saveglobals(filename): data = globalsfiltered() save_dictionary(data,filename) #%% savepath = 'test.spydata' saveglobals(savepath)
Дайте мне знать, если это работает для вас. Дэвид Б-Х
то, что вы пытаетесь сделать, это гибернация процесс. Это было обсуждали уже. Вывод состоит в том, что при попытке сделать это существует несколько трудноразрешимых проблем. Например, при восстановлении открытых файловых дескрипторов.
лучше подумать о подсистеме сериализации/десериализации для вашей программы. Это не тривиально во многих случаях, но гораздо лучшее решение в долгосрочной перспективе.
хотя если я преувеличил проблема. Вы можете попробовать замариновать свои глобальные переменные дикт. Используйте
globals()
для доступа к словарю. Поскольку он индексируется varname, вам не нужно беспокоиться о порядке.
один очень простой способ, который может удовлетворить ваши потребности. Для меня это было довольно хорошо:
просто нажмите на этот значок в Проводнике переменных (справа от паука):
если вы хотите, чтобы принятый ответ абстрагировался для работы, вы можете использовать:
import shelve def save_workspace(filename, names_of_spaces_to_save, dict_of_values_to_save): ''' filename = location to save workspace. names_of_spaces_to_save = use dir() from parent to save all variables in previous scope. -dir() = return the list of names in the current local scope dict_of_values_to_save = use globals() or locals() to save all variables. -globals() = Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called). -locals() = Update and return a dictionary representing the current local symbol table. Free variables are returned by locals() when it is called in function blocks, but not in class blocks. Example of globals and dir(): >>> x = 3 #note variable value and name bellow >>> globals() {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'x': 3, '__doc__': None, '__package__': None} >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'x'] ''' print 'save_workspace' print 'C_hat_bests' in names_of_spaces_to_save print dict_of_values_to_save my_shelf = shelve.open(filename,'n') # 'n' for new for key in names_of_spaces_to_save: try: my_shelf[key] = dict_of_values_to_save[key] except TypeError: # # __builtins__, my_shelf, and imported modules can not be shelved. # #print('ERROR shelving: {0}'.format(key)) pass my_shelf.close() def load_workspace(filename, parent_globals): ''' filename = location to load workspace. parent_globals use globals() to load the workspace saved in filename to current scope. ''' my_shelf = shelve.open(filename) for key in my_shelf: parent_globals[key]=my_shelf[key] my_shelf.close() an example script of using this: import my_pkg as mp x = 3 mp.save_workspace('a', dir(), globals())
скачать/загрузить рабочее пространство:
import my_pkg as mp x=1 mp.load_workspace('a', globals()) print x #print 3 for me
он работал, когда я проверил его. Признаюсь, я не понимаю
dir()
иglobals()
100% поэтому я не уверен, что может быть какая-то странная оговорка, но до сих пор это, кажется, работает. Комментарии приветствуются :)
после некоторых исследований, если вы позвоните
save_workspace
как я предложил с глобалами иsave_workspace
находится в пределах функции он не будет работать как и ожидалось, если вы хотите сохранить проверяемые файлы в локальной области. Для этого используйтеlocals()
. Это происходит потому, что globals берет глобалы из модуля, где определена функция, а не из того, где она вызывается, было бы моим предположением.