How to save all the variables in the current python session?

我想保存当前 python 环境中的所有变量。似乎有一种选择是使用“ pickle”模块。然而,我不想这样做有两个原因:

  1. 我必须为每个变量调用 pickle.dump()
  2. 当我想要检索变量时,我必须记住保存变量的顺序,然后执行 pickle.load()来检索每个变量。

我正在寻找一些命令,将保存整个会话,以便当我加载这个保存的会话,所有的变量都恢复。这可能吗?

编辑: 我想我不介意为每个想要保存的变量调用 pickle.dump(),但是记住变量保存的确切顺序似乎是一个很大的限制。我不想这样。

122529 次浏览

你要做的就是让你的过程休眠。这已经是 discussed了。结论是,在尝试这样做的过程中,存在着几个难以解决的问题。例如,还原打开的文件描述符。

最好考虑程序的序列化/反序列化子系统。在许多情况下,它不是微不足道的,但是从长远的角度来看,它是一个更好的解决方案。

虽然我夸大了问题的严重性。您可以尝试调整全局变量 迪克特。使用 globals()访问字典。因为它是用 varname 索引的,所以不必担心顺序。

如果使用 搁置,则不必记住对象 pickle 的顺序,因为 shelve提供了一个类似字典的对象:

To shelve your work:

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]

下面是使用 spyderlib 函数保存 Spyder 工作区变量的方法

#%%  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)

如果对你有用就告诉我。 David B-H

坐在这里并且未能将 globals()保存为字典,我发现您可以使用 dill 库来 pickle 一个会话。

这可以通过以下方法实现:

import dill                            #pip install dill --user
filename = 'globalsave.pkl'
dill.dump_session(filename)


# and to load the session again:
dill.load_session(filename)

如果你想让已接受的答案抽象为函数,你可以使用:

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

to get/load the workspace:

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 从定义函数的模块获取全局变量,而不是从调用它的地方获取全局变量。

一个非常简单的方法可以满足你的需求,对我来说,它做得很好:

Simply, click on this icon on the Variable Explorer (right side of Spider):

Saving all the variables in *.spydata format

Loading all the variables or pics etc.

您可以将其保存为文本文件或 CVS 文件。例如,人们使用 Spyder 来保存变量,但它有一个已知的问题: 对于特定的数据类型,它无法在路上导入。