मौजूदा अजगर सत्र में सभी चर कैसे बचाएं?


95

मैं अपने मौजूदा अजगर पर्यावरण में सभी चर को बचाना चाहता हूं। ऐसा लगता है कि एक विकल्प 'अचार' मॉड्यूल का उपयोग करना है। हालाँकि, मैं ऐसा 2 कारणों से नहीं करना चाहता:

  1. मुझे pickle.dump()प्रत्येक चर के लिए कॉल करना होगा
  2. जब मैं चर को पुनः प्राप्त करना चाहता हूं, तो मुझे उस क्रम को याद रखना चाहिए जिसमें मैंने चर को बचाया था, और फिर pickle.load()प्रत्येक चर को पुनः प्राप्त करने के लिए एक किया।

मुझे कुछ कमांड की तलाश है जो पूरे सत्र को बचाएंगे, ताकि जब मैं इस सहेजे गए सत्र को लोड करूं, तो मेरे सभी चर बहाल हो जाएं। क्या यह संभव है?

संपादित करें: मुझे लगता है pickle.dump()कि मुझे उस प्रत्येक चर के लिए कॉल करने में कोई आपत्ति नहीं है जिसे मैं सहेजना चाहूंगा, लेकिन सटीक क्रम को याद रखना जिसमें चर बच गए थे, एक बड़े प्रतिबंध की तरह लगता है। मैं उससे बचना चाहता हूं।

जवाबों:


83

यदि आप आश्रय का उपयोग करते हैं, तो आपको उस क्रम को याद रखने की ज़रूरत नहीं है, जिसमें वस्तुओं को चुना गया है, क्योंकि 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, मुझे यह वाक्य आपकी पोस्ट सुपर फनी में मिला: "अपने काम को पूरा करने के लिए" :)
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 चर हैं। कोई विचार कैसे इस को हल किया जा सकता है? क्या इस सत्र के बाद मौजूदा सत्र को बचाने का कुछ बेहतर तरीका है?
नरक

1
मुझे ऊपर वर्णित के रूप में शेल्व के उपयोग के बारे में एक ही समस्या है। PicklingError: अचार नहीं कर सकता <टाइप करें 'numpy.int32'>: यह numpy.int32 जैसी ही वस्तु नहीं है
Pu Zhang

1
ऐसा लगता है कि कुछ बिलिन फ़ंक्शंस और पैकेज को आश्रय नहीं दिया जा सकेगा, इसलिए केवल except:इसके बजाय उपयोग करें except TypeError:। यह उपयोगकर्ता परिभाषित चर और अधिकांश ऑब्जेक्ट्स (पंडों डेटा फ़्रेमों को मेरे लिए ठीक किया जाएगा)
निट्रो

65

यहाँ बैठे और globals()एक शब्दकोश के रूप में सहेजने में विफल रहे , मुझे पता चला कि आप डिल लाइब्रेरी का उपयोग करके एक सत्र चुन सकते हैं।

इसका उपयोग करके किया जा सकता है:

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 () चलाते हैं जो उस फ़ंक्शन के लिए स्थानीय हैं जो सहेजे नहीं जाते हैं।
परसा

3
यह सिर्फ एक गुंजाइश मुद्दा है, मुझे लगता है कि आप अपने सभी स्थानीय लोगों () को ग्लोबल्स () में जोड़ सकते हैं यदि आपको चाहिए?
user2589273

मुझे "TypeError: अचार सॉकेट ऑब्जेक्ट नहीं मिल सकता है"
R. Cox

1
सत्र को डंप करते समय मुझे निम्न प्रकार की त्रुटि मिलती है: TypeError: no default __reduce__ due to non-trivial __cinit__
करीम जिरौदी

मैंने यह कोशिश की और पाया कि यह नामांकित सरणियों को नहीं बचा सकता है, हालांकि यह अचार सीमा हो सकती है।
राखी

6

एक बहुत आसान तरीका है जो आपकी आवश्यकताओं को पूरा कर सकता है। मेरे लिए, इसने बहुत अच्छा किया:

बस, इस आइकन पर क्लिक करें चर एक्सप्लोरर (स्पाइडर के दाईं ओर):

सभी चर को .spydata प्रारूप में सहेजना

सभी चर या चित्र आदि लोड हो रहे हैं।


मैंने कल .spydata प्रारूप में सभी चर सहेजे और मैंने आज डेटा आयात करने का प्रयास किया। कोई चर आयात नहीं किया जाता है :(
भरत राम अम्मू

यह मेरे लिए काम कर रहा था, लेकिन अब मेरे पास स्पाइडाटा फ़ाइल बनाने के बजाय इसका डेटा अधिक है, अब शून्य सामग्री के साथ अचार फ़ाइल के साथ-साथ सैकड़ों npy फाइलें भी बनाता है। मैं इन्हें कैसे खोलूँ?
आर। कॉक्स

4

यहाँ एक तरह से स्पाइडर वर्कस्पेस वैरिएबल को बचाने के लिए स्पाइडरलिब फ़ंक्शंस का उपयोग किया गया है

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

अगर यह आप के लिए काम करता है तो मुझे बतलाएगा। डेविड बीएच


"NameError: नाम 'fpath' परिभाषित नहीं है": क्या मैं कुछ भूल गया था?
थॉमस

वह एक अच्छा विचार है। मैं एक ही चीज़ के लिए स्पाइडर के कार्यक्षेत्र से उधार लेने के बारे में सोच रहा था। लेकिन यह पता नहीं कैसे। हालाँकि, मुझे आपका कोड बिलकुल समझ में नहीं आया। क्या आप बता सकते हैं, क्या यह बिल्कुल स्पाइडर की तरह काम करता है कि यह स्वचालित रूप से सभी वेरिबल्स को पकड़ लेता है, या मुझे उन वेरिएबल को निर्दिष्ट करना होगा जिन्हें मैं उपयोग करना चाहता हूं?
cccn1991

2

आप जो करने की कोशिश कर रहे हैं वह आपकी प्रक्रिया को हाइबरनेट करना है। इस पर पहले ही चर्चा हो चुकी थी। निष्कर्ष यह है कि ऐसा करने की कोशिश करते समय कई मुश्किल से हल करने वाली समस्याएं मौजूद हैं। उदाहरण के लिए ओपन फाइल डिस्क्रिप्टर को बहाल करने के साथ।

अपने कार्यक्रम के लिए क्रमांकन / deserialization सबसिस्टम के बारे में सोचना बेहतर है। यह कई मामलों में तुच्छ नहीं है, लेकिन लंबे समय के परिप्रेक्ष्य में बेहतर समाधान है।

हालांकि अगर मैंने समस्या बढ़ा दी है। आप अपने वैश्विक चर को तानाशाही से अचार बनाने की कोशिश कर सकते हैं । globals()शब्दकोश तक पहुँचने के लिए उपयोग करें । चूंकि यह varname-indexed है इसलिए आप ऑर्डर के बारे में परेशान नहीं होते हैं।


Nopes। मैं इस प्रक्रिया को हाइबरनेट करने की कोशिश नहीं कर रहा हूं। मेरे पास एक इंटरैक्टिव पाइथन शेल है, जिस पर मैं कई स्क्रिप्ट और कमांड चलाता हूं। मैं इनमें से कुछ कमांडों के आउटपुट (वेरिएबल्स) को बचाना चाहता हूं, ताकि भविष्य में जब भी मुझे आउटपुट तक पहुंच की आवश्यकता हो, मैं सिर्फ एक पायथन शेल को फायर कर सकता हूं और इन सभी वेरिएबल्स को लोड कर सकता हूं।
user10

अतः, शब्दकोष__ चुनें -> 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

आप इसे टेक्स्ट फाइल या सीवीएस फाइल के रूप में सहेज सकते हैं। लोग चर को बचाने के लिए उदाहरण के लिए स्पाइडर का उपयोग करते हैं, लेकिन इसका एक ज्ञात मुद्दा है: विशिष्ट डेटा प्रकारों के लिए यह सड़क में आयात करने में विफल रहता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.