Я хочу сохранить все переменные в моей текущей среде Python. Кажется, один из вариантов - использовать модуль «pickle». Однако я не хочу этого делать по 2 причинам:
- Я должен вызывать
pickle.dump()
каждую переменную - Когда я хочу получить переменные, я должен запомнить порядок, в котором я сохранил переменные, а затем выполнить a
pickle.load()
для получения каждой переменной.
Я ищу какую-нибудь команду, которая сохранит весь сеанс, чтобы при загрузке этого сохраненного сеанса все мои переменные были восстановлены. Это возможно?
Изменить: я думаю, я не против вызова pickle.dump()
каждой переменной, которую я хотел бы сохранить, но запоминание точного порядка, в котором были сохранены переменные, кажется большим ограничением. Я хочу этого избежать.
PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_input
в моем рабочем пространстве объявлены только две переменные. Есть идеи, как это решить? Есть ли лучший способ сохранить текущий сеанс после этого ответа?except:
вместоexcept TypeError:
. ЭтоСидя здесь и не сумев сохранить в
globals()
качестве словаря, я обнаружил, что вы можете мариновать сеанс, используя библиотеку укропа.Это можно сделать с помощью:
import dill #pip install dill --user filename = 'globalsave.pkl' dill.dump_session(filename) # and to load the session again: dill.load_session(filename)
источник
TypeError: no default __reduce__ due to non-trivial __cinit__
Один очень простой способ, который может удовлетворить ваши потребности. Для меня это очень хорошо:
Просто щелкните этот значок в проводнике переменных (справа от Spider):
Сохранение всех переменных в формате * .spydata
Загрузка всех переменных или изображений и т. Д.
источник
Вот способ сохранения переменных рабочего пространства 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)
Сообщите мне, если это сработает для вас. Дэвид Б.Х.
источник
Вы пытаетесь перевести процесс в спящий режим. Об этом уже говорили . Вывод состоит в том, что существует несколько трудных для решения проблем при попытке решить эту проблему. Например, с восстановлением дескрипторов открытых файлов.
Лучше подумать о подсистеме сериализации / десериализации для вашей программы. Во многих случаях это нетривиально, но в долгосрочной перспективе это гораздо лучшее решение.
Хотя если бы я преувеличил проблему. Вы можете попробовать обработать свои глобальные переменные dict . Используйте
globals()
для доступа к словарю. Поскольку он индексируется по имени переменной, вам не нужно беспокоиться о порядке.источник
Если вы хотите, чтобы принятый ответ был абстрактным, вы можете использовать:
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()
. Это происходит потому, что глобальные переменные берут глобальные переменные из модуля, в котором определена функция, а не из того места, где она вызывается.источник
Вы можете сохранить его как текстовый файл или файл CVS. Например, люди используют Spyder для сохранения переменных, но у него есть известная проблема: для определенных типов данных он не может быть импортирован в будущем.
источник