Как сохранить все переменные в текущей сессии python?
Я хочу сохранить все переменные в моей текущей среде python. Кажется, один из вариантов - использовать модуль "pickle". Однако я не хочу делать это по двум причинам:
1) Мне нужно вызвать pickle.dump() для каждой переменной
2) Когда я хочу получить переменные, я должен запомнить порядок, в котором я сохранил переменные, а затем сделать pickle.load() для извлечения каждой переменной.
Я ищу некоторую команду, которая сохранит весь сеанс, так что когда я загружу этот сохраненный сеанс, все мои переменные будут восстановлены. Возможно ли это?
Большое спасибо!
Gaurav
Изменить: я думаю, я не против вызова pickle.dump() для каждой переменной, которую я хотел бы сохранить, но помнить точный порядок, в котором были сохранены переменные, кажется большим ограничением. Я хочу этого избежать.
Ответы
Ответ 1
Если вы используете 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]
Ответ 2
Просидев здесь и не смог сохранить globals()
в качестве словаря, я обнаружил, что вы можете рассортировать сеанс, используя библиотеку укропов.
Это можно сделать, используя:
import dill #pip install dill --user
filename = 'globalsave.pkl'
dill.dump_session(filename)
# and to load the session again:
dill.load_session(filename)
Ответ 3
То, что вы пытаетесь сделать, - это спящий режим. Об этом уже говорилось . Вывод состоит в том, что при попытке сделать это существует несколько трудных для решения проблем. Например, при восстановлении дескрипторов открытых файлов.
Лучше подумать о подсистеме сериализации/десериализации для вашей программы. Во многих случаях это не тривиально, но гораздо лучшее решение в долгосрочной перспективе.
Хотя я преувеличил проблему. Вы можете попытаться определить ваши глобальные переменные dict. Используйте globals()
для доступа к словарю. Поскольку он индексируется по имени, вы не должны беспокоиться о заказе.
Ответ 4
Ниже приведен способ сохранения переменных рабочего пространства 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)
Сообщите мне, если это сработает для вас.
Дэвид Б-Н
Ответ 5
Один очень простой способ, который может удовлетворить ваши потребности. Для меня это было очень хорошо:
Просто нажмите этот значок в Проводнике переменных (справа от Паука):
Сохранение всех переменных в формате *.spydata
Загрузка всех переменных или рисунков и т.д.
Ответ 6
Если вы хотите, чтобы принятый ответ был отнесен к функции, вы можете использовать:
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()
. Это происходит из-за того, что глобальные переменные принимают глобальные значения из модуля, где определена функция, а не от того, где она называется, будет моей догадкой.
Ответ 7
Я хотел добавить комментарий к unutbu-ответу, но у меня пока нет достаточной репутации. У меня также была проблема с
PicklingError: Can't pickle <built-in function raw_input>: it not the same object as __builtin__.raw_input
Я обошел его, добавив правило, чтобы передать все исключения и сказать мне, что он не хранил. unubtu tweaked code, для удобства copypaste:
Отложить работу:
import shelve
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('TypeError shelving: {0}'.format(key))
except:
# catches everything else
print('Generic 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()