すべての変数を現在のpython環境に保存します。1つのオプションは 'pickle'モジュールを使用することです。しかし、2つの理由でこれを行いたくありません。
1)変数ごとにpickle.dump()を呼び出す必要があります
2)変数を取得する場合、変数を保存した順序を覚えてから、pickle.load()を実行して各変数を取得する必要があります。
セッション全体を保存するコマンドを探しています。そのため、この保存されたセッションをロードすると、すべての変数が復元されます。これは可能ですか?
どうもありがとう!
ガウラフ
編集:保存したい変数ごとにpickle.dump()を呼び出しても構いませんが、変数が保存された正確な順序を覚えることは大きな制限のようです。私はそれを避けたいです。
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()
を辞書として保存できなかったため、dillライブラリを使用してセッションをピクルできることがわかりました。
これは、次を使用して実行できます。
import dill #pip install dill --user
filename = 'globalsave.pkl'
dill.dump_session(filename)
# and to load the session again:
dill.load_session(filename)
あなたのニーズを満たすかもしれない1つの非常に簡単な方法。私にとっては、かなりうまくいきました。
単に、変数エクスプローラー(Spiderの右側)でこのアイコンをクリックしてください:
以下は、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)
うまくいくかどうか教えてください。デビッドB-H
あなたがしようとしているのは、プロセスを休止状態にすることです。これはすでに discuseded でした。結論は、そうしようとしている間に解決するのが難しい問題がいくつかあるということです。たとえば、開いているファイル記述子を復元する場合。
プログラムのシリアル化/逆シリアル化サブシステムについて考えることをお勧めします。多くの場合、それは些細なことではありませんが、長期的な観点でははるかに優れたソリューションです。
私が問題を誇張している場合。グローバル変数dictをピクルスすることができます。 globals()
を使用して、辞書にアクセスします。 varname-indexedであるため、順序について気にする必要はありません。
テキストファイルまたはCVSファイルとして保存できます。たとえば、変数を保存するためにSpyderを使用しますが、既知の問題があります。特定のデータ型では、道路にインポートできません。
受け入れられた回答を機能するように抽象化する場合は、次を使用できます。
_ 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()
を使用します。これは、グローバルが関数が定義されているモジュールからグローバルを取得するためであり、関数が呼び出される場所からではなく、私が推測するためです。