বর্তমান অজগর সেশনে কীভাবে সমস্ত ভেরিয়েবল সংরক্ষণ করবেন?


96

আমি আমার বর্তমান অজগর পরিবেশে সমস্ত পরিবর্তনগুলি সংরক্ষণ করতে চাই। মনে হচ্ছে একটি বিকল্প হল 'আচার' মডিউলটি ব্যবহার করা। তবে আমি 2 কারণে এটি করতে চাই না:

  1. আমাকে pickle.dump()প্রতিটি ভেরিয়েবলের জন্য কল করতে হবে
  2. আমি যখন ভেরিয়েবলগুলি পুনরুদ্ধার করতে চাই, তখন অবশ্যই অবশ্যই আমার ক্রমটি ক্রিয়াটি স্মরণ করে রাখতে হবে এবং তারপরে pickle.load()প্রতিটি ভেরিয়েবল পুনরুদ্ধার করতে একটি কাজ করতে হবে।

আমি এমন কিছু কমান্ড সন্ধান করছি যা পুরো সেশনটি সংরক্ষণ করবে, যাতে আমি যখন এই সংরক্ষিত সেশনটি লোড করি তখন আমার সমস্ত ভেরিয়েবল পুনরুদ্ধার হয়। এটা কি সম্ভব?

সম্পাদনা: আমি অনুমান করি pickle.dump()যে প্রতিটি পরিবর্তনশীল যা আমি সংরক্ষণ করতে চাই তার প্রতি আহ্বান জানাতে আমার আপত্তি নেই , তবে ভেরিয়েবলগুলি কীভাবে সংরক্ষণ করা হয়েছিল তা সঠিকভাবে মনে করে মনে রাখা বড় বাধা বলে মনে হয়। আমি তা এড়াতে চাই

উত্তর:


84

আপনি যদি তাকটি ব্যবহার করেন তবে আপনাকে ক্রমান্বয়ে ক্রমগুলি মনে করতে হবে না, যেহেতু 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
পারফেক্ট এই আমি খুঁজছিলাম ছিল। বিটিডাব্লু, আমি আপনার পোস্টে এই বাক্যটি অত্যন্ত মজার বলে মনে করি: "আপনার কাজের
ঝালাই করা

4
এবং এখানে আমি ভেবেছিলাম "আচার" মজাদার ছিল! :) en.wikipedia.org/wiki/Inherently_funny_word
unutbu

4
আমি জানি এই উত্তরটি খুব পুরাতন বাইট হয় যখন আমি এটি করি যখন আমার নীচের ত্রুটি থাকে: PicklingError: Can't pickle <built-in function raw_input>: it's not the same object as __builtin__.raw_inputআমার কার্যক্ষেত্রে আমার কেবলমাত্র 2 ভেরিয়েবল ঘোষণা করা আছে। কোন ধারনা কিভাবে এই সমস্যা সমাধানের? বর্তমান সেশনটি সংরক্ষণের আরও ভাল কোনও উপায় এই উত্তরের পরে কী এসেছে?
Hellter

4
উপরে বর্ণিত তাকের ব্যবহার সম্পর্কে আমার একই সমস্যা রয়েছে। পিক্লিংএরআরআর: <টাইপ 'numpy.int32'> আচার নিতে পারবেন না: এটি numpy.int32 হিসাবে একই জিনিস নয়
পু ঝাং

4
দেখে মনে হচ্ছে কিছু বিল্টিন ফাংশন এবং প্যাকেজগুলি শেল্ভ করা যাবে না তাই কেবল 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 () চালান যা সে ফাংশনের স্থানীয় যা সেভ হয় না।
পার্সা

4
কেবলমাত্র একটি সুযোগের বিষয়, আমি অনুমান করি আপনি যদি চান তবে আপনি কেবল আপনার সমস্ত লোকালকে () গ্লোবালগুলিতে () যুক্ত করতে পারেন?
ব্যবহারকারী 2589273

আমি পেয়েছি "TypeError: সকেট অবজেক্টগুলিকে বাছাই করতে পারছি না"
আর কক্স ২

4
সেশনটি ফেলে দেওয়ার সময় আমি নিম্নলিখিত ধরণের ত্রুটি TypeError: no default __reduce__ due to non-trivial __cinit__
পেয়েছি

আমি এটি চেষ্টা করে দেখেছি এটি নামযুক্ত অ্যারেগুলি সংরক্ষণ করতে পারে না যদিও এটি একটি আচারের সীমাবদ্ধতা হতে পারে।
রোড

6

একটি খুব সহজ উপায় যা আপনার প্রয়োজনগুলি পূরণ করতে পারে। আমার জন্য, এটি বেশ ভাল করেছে:

সহজভাবে, ভেরিয়েবল এক্সপ্লোরার (স্পাইডারের ডান দিকের) এ আইকনে ক্লিক করুন:

* .স্পিডাটা ফর্ম্যাটে সমস্ত ভেরিয়েবল সংরক্ষণ করা

সমস্ত ভেরিয়েবল বা ছবিগুলি লোড করা হচ্ছে etc.


আমি গতকাল .spydata ফর্ম্যাটে সমস্ত ভেরিয়েবল সংরক্ষণ করেছি এবং আমি আজ ডেটা আমদানির চেষ্টা করেছি। কোনও পরিবর্তনশীল আমদানি হয় না :(
ভারত রাম আম্মু

এটি আমার পক্ষে কাজ করছিল তবে এখন আমার কাছে স্পাইডাটা ফাইল তৈরির চেয়ে আরও ডেটা রয়েছে, এখন শূন্য বিষয়বস্তু সহ শত শত এনপিপি ফাইলের সাথে একটি আচার ফাইল তৈরি করে। আমি কীভাবে এগুলি খুলব?
আর কক্স

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' সংজ্ঞায়িত করা হয়নি": আমি কিছু ভুলে গেছি?
থমাস

এটি দারুণ ভাবনা. আমি একই জিনিসটির জন্য স্পাইডারের কর্মক্ষেত্র থেকে aboutণ নেওয়ার বিষয়ে ভাবছিলাম। তবে কীভাবে তা বুঝতে পারেনি। তবে আমি আপনার কোডটি বেশ বুঝতে পারি নি। আপনি দয়া করে বলতে পারেন, এটি কি স্পাইডারের মতো ঠিক কাজ করে যে এটি স্বয়ংক্রিয়ভাবে সমস্ত ভেরিয়েবলগুলি ক্যাচ করে, অথবা আমি যে ভেরিয়েবলগুলি ব্যবহার করতে চাই তা নির্দিষ্ট করতে হবে?
cqcn1991

2

আপনি যা করার চেষ্টা করছেন তা হ'ল আপনার প্রক্রিয়াটি হাইবারনেট করা। এটি ইতিমধ্যে আলোচনা করা হয়েছিল । উপসংহারটি হ'ল এটি করার চেষ্টা করার সময় বেশ কয়েকটি হার্ড-টু-হ্যল সমাধান সমস্যা রয়েছে। ওপেন ফাইল বর্ণনাকারী পুনরুদ্ধার সঙ্গে উদাহরণস্বরূপ।

আপনার প্রোগ্রামের সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন সাবসিস্টেম সম্পর্কে ভাবা ভাল। এটি অনেক ক্ষেত্রে তুচ্ছ নয়, তবে দীর্ঘ সময়ের দৃষ্টিকোণে এটি আরও ভাল সমাধান।

যদিও আমি সমস্যাটি অতিরঞ্জিত করেছি। আপনি আপনার গ্লোবাল ভেরিয়েবলগুলি ডিক করার চেষ্টা করতে পারেন । ব্যবহারের globals()অভিধান অ্যাক্সেস করতে। যেহেতু এটির নাম-সূচকযুক্ত তাই আপনাকে অর্ডারটি নিয়ে মাথা ঘামানোর দরকার নেই।


নাপস। আমি প্রক্রিয়াটি হাইবারনেট করার চেষ্টা করছি না। আমার একটি ইন্টারেক্টিভ পাইথন শেল রয়েছে যার উপর আমি বেশ কয়েকটি স্ক্রিপ্ট এবং কমান্ড চালাচ্ছি। আমি এই কয়েকটি কমান্ডের আউটপুট (ভেরিয়েবল) সংরক্ষণ করতে চাই, যাতে ভবিষ্যতে যখনই আমার আউটপুট অ্যাক্সেসের প্রয়োজন হয়, আমি কেবল একটি পাইথন শেলটি ফায়ার করতে পারি এবং এই সমস্ত ভেরিয়েবলগুলি লোড করতে পারি।
ইউজার

সুতরাং, অভিধানটি বেছে নিন 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

আপনি এটি একটি পাঠ্য ফাইল বা সিভিএস ফাইল হিসাবে সংরক্ষণ করতে পারেন। ভেরিয়েবলগুলি সংরক্ষণ করার জন্য লোকে উদাহরণস্বরূপ স্পাইডার ব্যবহার করে তবে এটির একটি জ্ঞাত সমস্যা রয়েছে: নির্দিষ্ট ডেটা ধরণের জন্য এটি রাস্তায় আমদানি করতে ব্যর্থ হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.