2010-07-29 20 views
12

मैं cpickle का उपयोग कर दूरस्थ वातावरण में फ़ंक्शन को लोड करने का प्रयास कर रहा हूं। लेकिन मुझे त्रुटि मिली "मॉड्यूल" ऑब्जेक्ट में कोई विशेषता नहीं है ... "। कहाँ मैं वास्तव में अटक नाम स्थान पहले से ही जिम्मेदार बताते हैं कि, भले ही यह लोड करने के लिए कृपया मददविशेषताएँ त्रुटि: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है (सीपीकल का उपयोग करते समय)

import inspect 
import cPickle as pickle 
from run import run 


def get_source(func): 
sourcelines = inspect.getsourcelines(func)[0] 
sourcelines[0] = sourcelines[0].lstrip() 
return "".join(sourcelines) 

def fun(f): 
return f() 

def fun1(): 
return 10 

funcs = (fun, fun1) 

sources = [get_source(func) for func in funcs] 

funcs_serialized = pickle.dumps((fun.func_name,sources),0) 

args_serialized = pickle.dumps(fun1,0) 

#Creating the Environment where fun & fun1 doesnot exist 
del globals()['fun'] 
del globals()['fun1'] 

r = run() 

r.work(funcs_serialized,args_serialized) 

यहाँ run.py है विफल रहता है शामिल है

import cPickle as pickle 

class run(): 
def __init__(self): 
    pass 

def work(self,funcs_serialized,args_serialized): 

    func, fsources = pickle.loads(funcs_serialized) 

    fobjs = [compile(fsource, '<string>', 'exec') for fsource in fsources] 

    #After eval fun and fun1 should be there in globals/locals 
    for fobj in fobjs: 
    try: 
    eval(fobj) 
    globals().update(locals()) 
    except: 
    pass 

    print "Fun1 in Globals: ",globals()['fun1'] 
    print "Fun1 in locals: ",locals()['fun1'] 
    arg = pickle.loads(args_serialized) 

त्रुटि

Fun1 in Globals: <function fun1 at 0xb7dae6f4> 
Fun1 in locals: <function fun1 at 0xb7dae6f4> 
Traceback (most recent call last): 
    File "fun.py", line 32, in <module> 
    r.work(funcs_serialized,args_serialized) 
    File "/home/guest/kathi/python/workspace/run.py", line 23, in work 
    arg = pickle.loads(args_serialized) 
AttributeError: 'module' object has no attribute 'fun1' 
है

उत्तर

8

में प्रयास करें। बेहतर समाधान लोड हो रहा है मॉड्यूल (या __main__) के सिर में जोड़ने के लिए है:

from myclassmodule import MyClass 

लेकिन मुझे लगता है एक बेहतर समाधान मौजूद होना चाहिए।

0

फ़ंक्शन का मॉड्यूल नाम अचार में सहेजा जाता है, जब आप loads कर रहे हैं तो यह fun1 की तलाश में है __main__ या जहाँ में यह http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled से मूल रूप से

+0

तो fun1 है मॉड्यूल में एकीकृत, चलाने कहना –

6

था:

Note that functions (built-in and user-defined) are pickled by “fully qualified” name reference, not by value. This means that only the function name is pickled, along with the name of module the function is defined in. Neither the function’s code, nor any of its function attributes are pickled. Thus the defining module must be importable in the unpickling environment, and the module must contain the named object, otherwise an exception will be raised.

आप इस प्रकार त्रुटि मॉड्यूल fun1 को परिभाषित करता है में fun1 के संदर्भ में नष्ट कर दिया,। http://stefaanlippens.net/python-pickling-and-dealing-with-attributeerror-module-object-has-no-attribute-thing.html

यह दो समाधान देता है:

+0

मैं जानबूझकर संदर्भ नष्ट कर दिया है, लेकिन eval() के दौरान इसे फिर से इसे में भी गहराई से देख मैं कल्पना कर सकते हैं कि eval समारोह को परिभाषित करता है बिना नाम स्थान –

+1

में निर्मित है मॉड्यूल के बजाए रन मॉड्यूल के वैश्विक दायरे में मूल रूप से परिभाषित किया गया था (संभवतः '__main__'?)। आपके परीक्षण का एक बेहतर अभ्यास किसी अन्य मॉड्यूल ("my_funcs.py") में फ़ंक्शंस को परिभाषित करना होगा जो फ़ंक्शन ऑब्जेक्ट का संदर्भ बनाए रखता है। याद रखें कि फ़ंक्शन ऑब्जेक्ट्स वास्तव में मसालेदार नहीं हैं - केवल पूर्णतः योग्य नाम। जिस मॉड्यूल में इसे परिभाषित किया गया है वह आयात योग्य होना चाहिए और इसमें फ़ंक्शन का नाम एक विशेषता के रूप में होना चाहिए। –

+1

क्या आप समांतर पाइथन से परिचित हैं? वे ठीक उसी तरीके से कर रहे हैं, वे func और इसके तर्कों को उठाते हैं और फ़ंक्शन चलाने के लिए भेजे जाते हैं। लेकिन जब वे रन() करते हैं, तो यह पूरी तरह से निष्पादित होता है। मैं जानना चाहता हूं कि कैसे वे इसे प्राप्त करते हैं, क्या समानांतर पायथन से संपर्क करना बेहतर है? –

1

मैं इस लिंक उपयोगी पाया

from your_first_module import fun,fun1 

जोड़ने के लिए run.py

संबंधित मुद्दे

 संबंधित मुद्दे