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

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

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

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

편집 : 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)


답변

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

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

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

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


답변

다음은 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


답변

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

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

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


답변

수락 된 답변이 작동하도록 추상화하려면 다음을 사용할 수 있습니다.

    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가 함수가 정의 된 모듈에서 전역을 취하기 때문에 발생합니다.


답변

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