現在のPythonセッションですべての変数を保存するにはどうすればよいですか?


93

現在のPython環境ですべての変数を保存したい。1つのオプションは、「pickle」モジュールを使用することです。ただし、次の2つの理由でこれを実行したくありません。

1)変数ごとにpickle.dump()を呼び出す必要があります
2)変数を取得するときは、変数を保存した順序を覚えてから、pickle.load()を実行して各変数を取得する必要があります。

セッション全体を保存するコマンドを探しています。この保存されたセッションをロードすると、すべての変数が復元されます。これは可能ですか?

どうもありがとう!
ガウラフ

編集:保存したい変数ごとにpickle.dump()を呼び出しても構わないと思いますが、変数が保存された正確な順序を覚えておくことは大きな制限のように思えます。それは避けたいです。

回答:


83

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]

4
完璧です。これは私が探していたものです。ところで、私はあなたの投稿でこの文章を
とても

3
そして、ここで「ピクルス」は面白いと思った!:) en.wikipedia.org/wiki/Inherently_funny_word
unutbu

1
私がこれを行うとき、私はこの答えが非常に古いことを知っPicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_inputています。次のエラーが発生します:ワークスペースで2つの変数が宣言されているだけです。これを解決する方法に関するアイデアはありますか?この回答の後、現在のセッションを保存するためのより良い方法が出てきましたか?
hellter

1
上記と同じように、shelveの使用に関して問題があります。PicklingError:<type 'numpy.int32'>をピクルできません:numpy.int32と同じオブジェクトではありません
Pu Zhang

1
一部の組み込み関数とパッケージは棚上げできないようですので、のexcept:代わりに使用してくださいexcept TypeError:。これにより、ユーザー定義の変数とほとんどのオブジェクトが棚上げされます(パンダのデータフレームは私のために棚上げされました)
Nitro

64

ここに座っ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)

dillがすべての変数を保存することはないと思います。たとえば、その関数に対してローカルな関数変数でdill.dump_session()を実行すると、保存されません。
パルサ

3
これはスコープの問題にすぎません。必要な場合は、すべてのlocals()をglobals()に追加できますか?
user2589273 2018年

「TypeError:ソケットオブジェクトをピクルできません」
R.コックス

1
セッションをダンプするとき、私は、次のタイプのエラーを取得: TypeError: no default __reduce__ due to non-trivial __cinit__
カリームJeiroudi

これを試したところ、名前付き配列を保存できないことがわかりました。
rhody

6

あなたのニーズを満たすかもしれない非常に簡単な方法。私にとって、それはかなりうまくいきました:

Variable Explorer(Spiderの右側)でこのアイコンをクリックするだけです。

すべての変数を* .spydata形式で保存する

すべての変数または写真などをロードする


昨日すべての変数を.spydata形式で保存し、今日はデータをインポートしようとしました。変数はインポートされません:(
Bharat Ram Ammu

これは私にとってはうまくいきましたが、Spydataファイルを作成するのではなく、より多くのデータを取得したので、内容がゼロのピクルファイルと何百ものnpyファイルが作成されます。どうやって開くの?
R.コックス

4

これは、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) 

それがあなたのために働くかどうか私に知らせてください。デビッドBH


"NameError:名前 'fpath'が定義されていません":何かを忘れましたか?
トーマス

それは良いアイデアです。同じことのためにスパイダーのワークスペースから借りることを考えていました。しかし、その方法はわかりませんでした。しかし、私はあなたのコードを完全に理解していませんでした。これはSpyderとまったく同じように機能し、すべての変数を自動的にキャッチしますか、それとも使用したい変数を指定する必要がありますか?
cqcn1991

2

あなたがしようとしていることは、プロセスを休止状態にすることです。これはすでに議論されました。結論は、そうしようとするときに解決しにくい問題がいくつか存在するということです。たとえば、開いているファイル記述子を復元します。

プログラムのシリアライゼーション/デシリアライゼーションサブシステムについて考えることをお勧めします。多くの場合、それは簡単なことではありませんが、長い目で見るとはるかに優れたソリューションです。

問題を誇張したとしても。グローバル変数dictをピクルスにしてみることができます。globals()辞書にアクセスするために使用します。varnameで索引付けされているため、順序を気にする必要はありません。


いいえ。プロセスを休止状態にするつもりはありません。いくつかのスクリプトとコマンドを実行するインタラクティブなPythonシェルがあります。これらのコマンドの一部の出力(変数)を保存したいので、将来、出力にアクセスする必要があるときはいつでも、Pythonシェルを起動してこれらのすべての変数をロードできます。
user10

したがって、ディクショナリvar_name-> var_valueをピクルします
nkrkv

0

受け入れられた回答を抽象化して機能させたい場合は、以下を使用できます。

    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()。これは、グローバルが関数が定義されているモジュールからグローバルを取得するためであり、関数が呼び出された場所からではないためと考えられます。


0

テキストファイルまたはCVSファイルとして保存できます。たとえば、変数を保存するためにSpyderを使用しますが、これには既知の問題があります。特定のデータ型では、途中でインポートに失敗します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.