현재 파이썬 세션의 모든 변수를 저장하는 방법은 무엇입니까?


95

현재 Python 환경의 모든 변수를 저장하고 싶습니다. 한 가지 옵션은 'pickle'모듈을 사용하는 것 같습니다. 그러나 다음 두 가지 이유로이 작업을 수행하고 싶지 않습니다.

  1. pickle.dump()각 변수 를 호출 해야합니다.
  2. 변수를 검색하려면 변수를 저장 한 순서를 기억하고 pickle.load()각 변수를 검색하려면 a 를 수행해야 합니다.

이 저장된 세션을로드 할 때 모든 변수가 복원되도록 전체 세션을 저장할 명령을 찾고 있습니다. 이것이 가능한가?

편집 : 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
완전한. 이것이 제가 찾던 것입니다. BTW, 나는 당신의 게시물에서이 문장이 매우 재미 있다고 생각합니다 : "To shelve your work":)
user10

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
위에서 설명한 선반 사용과 관련하여 동일한 문제가 있습니다. PicklingError : Ca n't pickle <type 'numpy.int32'> : it 's not the same object as numpy.int32
Pu Zhang

1
일부 내장 함수와 패키지는 보류 할 수 없으므로 except:대신 except TypeError:. 이렇게하면 사용자 정의 변수와 대부분의 개체가 제거됩니다 (판다 데이터 프레임은 저에게 잘 보관됩니다).
Nitro

65

여기 앉아서 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)

예를 들어 해당 함수에 로컬 인 함수 변수에서 dill.dump_session ()을 실행하면 dill이 모든 변수를 저장한다고 생각하지 않습니다.
Parsa

3
그것은 단지 범위 문제 일뿐입니다. 필요하다면 모든 locals ()를 globals ()에 추가 할 수 있습니까?
user2589273

나는 "TypeError : ca n't pickle Socket objects"
R. Cox

1
: 나는 세션을 덤핑 다음과 같은 유형의 오류 얻을 TypeError: no default __reduce__ due to non-trivial __cinit__
카림 Jeiroudi

나는 이것을 시도했고 이것이 피클 제한 일 수 있지만 명명 된 배열을 저장할 수 없다는 것을 알았습니다.
rhody

6

귀하의 요구를 충족시킬 수있는 매우 쉬운 방법입니다. 나를 위해 그것은 꽤 잘했습니다.

간단히 Variable Explorer (Spider의 오른쪽)에서이 아이콘을 클릭하십시오.

* .spydata 형식으로 모든 변수 저장

모든 변수 또는 사진 등을로드합니다.


어제 모든 변수를 .spydata 형식으로 저장했고 오늘 데이터를 가져 오려고했습니다. 어떤 변수는 :( 가져 오지됩니다
바랏 램 Ammu을

이것은 나를 위해 일했지만 이제는 Spydata 파일을 만드는 대신 더 많은 데이터가 있으므로 이제는 내용이없는 피클 파일과 수백 개의 npy 파일을 만듭니다. 제발 어떻게 열지?
R. Cox

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 : name 'fpath'is not defined": 잊은 것이 있습니까?
Thomas

좋은 생각이야. 나는 같은 일을 위해 스파이더의 작업 공간에서 빌리는 것에 대해 생각하고 있었다. 그러나 방법을 알지 못했습니다. 그러나 나는 당신의 코드를 이해하지 못했습니다. 이게 스파이더와 똑같은 방식으로 모든 변수를 자동으로 잡는다는 점을 말씀해 주시겠습니까? 아니면 사용하려는 변수를 지정해야합니까?
cqcn1991

2

당신이하려는 것은 프로세스를 최대 절전 모드로 만드는 것입니다. 이것은 논의되었습니다 이미 . 결론은 그렇게하려고 시도하는 동안 해결하기 어려운 몇 가지 문제가 존재한다는 것입니다. 예를 들어 열린 파일 설명자를 복원하는 경우.

프로그램의 직렬화 / 역 직렬화 하위 시스템에 대해 생각하는 것이 좋습니다. 많은 경우 사소한 것은 아니지만 장기간의 관점에서 훨씬 더 나은 솔루션입니다.

비록 내가 문제를 과장했다면. 전역 변수 dict 를 피클 할 수 있습니다 . globals()사전에 액세스하는 데 사용 합니다. varname 인덱싱이므로 주문에 대해 신경 쓰지 않아도됩니다.


아니요. 프로세스를 최대 절전 모드로 전환하려는 것이 아닙니다. 여러 스크립트와 명령을 실행하는 대화 형 파이썬 셸이 있습니다. 이러한 명령 중 일부의 출력 (변수)을 저장하여 나중에 출력에 액세스해야 할 때마다 Python 셸을 실행하고 이러한 모든 변수를로드 할 수 있도록합니다.
user10 2010-06-02

따라서, 사전 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하고 함수 내에 있으면 좀 더 조사한 후 로컬 범위에 veriables를 저장하려는 경우 예상대로 작동하지 않습니다. 그 사용을 위해 locals(). 이것은 globals가 함수가 정의 된 모듈에서 전역을 취하기 때문에 발생합니다.


0

텍스트 파일 또는 CVS 파일로 저장할 수 있습니다. 예를 들어 사람들은 변수를 저장하기 위해 Spyder를 사용하지만 알려진 문제가 있습니다. 특정 데이터 유형의 경우 도로에서 가져 오지 못합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.