Làm cách nào để lưu tất cả các biến trong phiên python hiện tại?


91

Tôi muốn lưu tất cả các biến trong môi trường python hiện tại của mình. Có vẻ như một tùy chọn là sử dụng mô-đun 'dưa chua'. Tuy nhiên, tôi không muốn làm điều này vì 2 lý do:

1) Tôi phải gọi pickle.dump () cho mỗi biến
2) Khi tôi muốn truy xuất các biến, tôi phải nhớ thứ tự mà tôi đã lưu các biến và sau đó thực hiện một pickle.load () để truy xuất từng biến.

Tôi đang tìm kiếm một số lệnh sẽ lưu toàn bộ phiên để khi tôi tải phiên đã lưu này, tất cả các biến của tôi sẽ được khôi phục. Điều này có khả thi không?

Cảm ơn rất nhiều!
Gaurav

Chỉnh sửa: Tôi đoán tôi không phiền khi gọi pickle.dump () cho mỗi biến mà tôi muốn lưu, nhưng việc ghi nhớ thứ tự chính xác mà các biến đã được lưu có vẻ như là một hạn chế lớn. Tôi muốn tránh điều đó.

Câu trả lời:


83

Nếu bạn sử dụng xiên , bạn không cần phải nhớ thứ tự mà các đối tượng được ngâm, kể từ khi shelvecung cấp cho bạn một cuốn từ điển giống như đối tượng:

Để tạm dừng công việc của bạn:

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

Để khôi phục lại:

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
Hoàn hảo. Đây là những gì tôi đang tìm kiếm. BTW, tôi thấy câu này trong bài đăng của bạn siêu buồn cười: "Để gác lại công việc của bạn" :)
10

3
Và ở đây tôi nghĩ "dưa chua" thật buồn cười! :) en.wikipedia.org/wiki/Inboardsly_funny_word
unutbu

1
Tôi biết câu trả lời này rất cũ khi tôi làm điều này, tôi gặp lỗi sau: PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_inputTôi chỉ có 2 biến được khai báo trong không gian làm việc của mình. Bất kỳ ý tưởng về cách giải quyết này? Có cách nào tốt hơn để lưu phiên hiện tại sau câu trả lời này không?
hellter

1
Tôi có cùng một vấn đề liên quan đến việc sử dụng giá đỡ như đã mô tả ở trên. PicklingError: Cần không dưa <gõ 'numpy.int32'>: nó không phải là cùng một đối tượng như numpy.int32
Pu Zhang

1
Dường như một số chức năng được xây dựng trong và gói sẽ không thể được hoãn vì vậy chỉ cần sử dụng except:thay vì except TypeError:. Điều này sẽ tạm dừng các biến do người dùng xác định và hầu hết các đối tượng (khung dữ liệu gấu trúc được xếp vào hàng tốt đối với tôi)
Nitro

64

Ngồi ở đây và không thể lưu globals()từ điển làm từ điển, tôi phát hiện ra bạn có thể chọn một phiên bằng cách sử dụng thư viện thì là.

Điều này có thể được thực hiện bằng cách sử dụng:

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

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

Tôi không nghĩ dill lưu tất cả các biến, ví dụ: nếu bạn chạy dill.dump_session () trong một biến hàm cục bộ cho hàm đó không được lưu.
Parsa

3
Đó chỉ là một vấn đề về phạm vi, tôi đoán bạn có thể chỉ cần nối tất cả các địa phương của mình () vào hình cầu () nếu bạn phải?
user2589273 Ngày

Tôi nhận được "TypeError: không thể lấy các đối tượng Socket"
R. Cox

1
Tôi gặp lỗi loại sau khi kết xuất phiên: TypeError: no default __reduce__ due to non-trivial __cinit__
Kareem Jeiroudi 29/10 '19

Tôi đã thử điều này và thấy nó không thể lưu các mảng được đặt tên mặc dù đây có thể là một hạn chế.
rhody

6

Một cách rất dễ dàng có thể đáp ứng nhu cầu của bạn. Đối với tôi, nó hoạt động khá tốt:

Chỉ cần nhấp vào biểu tượng này trên Trình khám phá biến (phía bên phải của Spider):

Lưu tất cả các biến ở định dạng * .spydata

Đang tải tất cả các biến hoặc ảnh, v.v.


Tôi đã lưu tất cả các biến ở định dạng .spydata ngày hôm qua và hôm nay tôi đã cố gắng nhập dữ liệu. Không biến được nhập khẩu :(
Bharat Ram Ammu

Điều này có hiệu quả với tôi nhưng bây giờ tôi có nhiều dữ liệu hơn, thay vì tạo tệp Spydata, giờ đây tạo một tệp kén không có nội dung cũng như hàng trăm tệp npy. Làm cách nào để mở những cái này?
R. Cox

4

Đây là một cách lưu các biến không gian làm việc Spyder bằng cách sử dụng các hàm spyderlib

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

Hãy cho tôi biết nếu nó làm việc cho bạn. David BH


"NameError: tên 'fpath' không được xác định": tôi có quên điều gì không?
Thomas

Đó là một ý kiến ​​hay. Tôi đã nghĩ về việc mượn từ không gian làm việc của spyder cho điều tương tự. Nhưng không tìm ra cách. Tuy nhiên, tôi không hoàn toàn hiểu mã của bạn. Bạn có thể vui lòng cho biết, điều này có hoạt động chính xác như Spyder mà nó tự động bắt tất cả các biến thể hay tôi phải chỉ định các biến mà tôi muốn sử dụng?
cqcn1991 Ngày

2

Những gì bạn đang cố gắng làm là ngủ đông quy trình của mình. Điều này đã được thảo luận rồi. Kết luận là có một số vấn đề khó giải quyết tồn tại trong khi cố gắng làm như vậy. Ví dụ với việc khôi phục bộ mô tả tệp đang mở.

Tốt hơn là nên nghĩ về hệ thống con tuần tự hóa / giải mã hóa cho chương trình của bạn. Nó không phải là tầm thường trong nhiều trường hợp, nhưng là giải pháp tốt hơn nhiều trong quan điểm lâu dài.

Mặc dù nếu tôi đã phóng đại vấn đề. Bạn có thể thử chọn các biến toàn cục của mình dict . Sử dụng globals()để truy cập từ điển. Vì nó được lập chỉ mục varname nên bạn không cần bận tâm về thứ tự.


Nopes. Tôi không cố gắng để quá trình ngủ đông. Tôi có một trình bao python tương tác trên đó tôi chạy một số tập lệnh và lệnh. Tôi muốn lưu đầu ra (các biến) của một số lệnh này, để sau này bất cứ khi nào tôi cần truy cập vào đầu ra, tôi có thể kích hoạt một trình bao python và tải tất cả các biến này.
10

Vì vậy, hãy chọn từ điển var_name -> var_value
nkrkv

0

Nếu bạn muốn câu trả lời được chấp nhận được tóm tắt để hoạt động, bạn có thể sử dụng:

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

để lấy / tải không gian làm việc:

import my_pkg as mp

x=1

mp.load_workspace('a', globals())

print x #print 3 for me

nó hoạt động khi tôi chạy nó. Tôi sẽ thừa nhận rằng tôi không hiểu dir()globals()100% vì vậy tôi không chắc liệu có thể có một số cảnh báo kỳ lạ hay không, nhưng cho đến nay nó có vẻ hoạt động. Bình luận được chào đón :)


sau một số nghiên cứu thêm nếu bạn gọi save_workspacenhư tôi đã đề xuất với toàn cầu và save_workspacenằm trong một hàm, nó sẽ không hoạt động như mong đợi nếu bạn muốn lưu các có thể xác minh trong phạm vi cục bộ. Để sử dụng đó locals(). Điều này xảy ra bởi vì các khối cầu lấy các khối cầu từ mô-đun nơi hàm được xác định, chứ không phải từ nơi nó được gọi là suy đoán của tôi.


0

Bạn có thể lưu nó dưới dạng tệp văn bản hoặc tệp CVS. Ví dụ, mọi người sử dụng Spyder để lưu các biến nhưng nó có một vấn đề đã biết: đối với các loại dữ liệu cụ thể, nó không thể nhập trong quá trình thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.