2010-07-29 42 views
12

Bu işlevi cPickle kullanarak uzak bir ortama yüklemeye çalışıyorum. Ama "modül 'nesnesinin özniteliği yok ... hatası aldım." Nerede Gerçekten sıkışmış ad zaten sahiptir o AttributeError: 'module' nesnesinin özniteliği yok (cPickle kullanırken)

İşte
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 olduğunu Yardım Lütfen yüklenmemesi rağmen ilişkilendirdiği içeriyor ise

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) 

hata

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' 
olduğunu

cevap

8

içine

from your_first_module import fun,fun1 

eklemeyi deneyin. Daha iyi bir çözüm yükleme modülü (veya __main__) başkanı eklemektir:

from myclassmodule import MyClass 

Ama daha iyi bir çözüm bulunmalıdır düşünüyorum.

6

oldu:

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.

Sen FUN1 tanımlayan modülünde böylece hatayı FUN1 başvurusunu silindi. http://stefaanlippens.net/python-pickling-and-dealing-with-attributeerror-module-object-has-no-attribute-thing.html

Bu iki çözüm sunar:

+0

çalıştırabilir, ancak eval() sırasında tekrar ben eval işlevini tanımlar hayal olur içine çok derinden bakmadan ad –

+1

yılında yeniden olduğunu söylemek Başlangıç ​​modülünün global kapsamı içinde, orijinal olarak tanımlanmış olan modül yerine (muhtemelen '__main__'?). Testinizin daha iyi bir alıştırması, işlev nesnesine bir referans veren başka bir modülde ("my_funcs.py") işlevleri tanımlamak olabilir. Unutmayın ki bu fonksiyon nesneleri gerçekten sadık değil - sadece tam isimleri. Tanımlandığı modülün içe aktarılabilir olması ve işlev isminin bir özellik olarak olması gerekir. –

+1

Paralel piton hakkında bilgi sahibi misiniz? aynı yolunu yapıyorlar, func ve argümanlarını seçtiler ve fonksiyonu çalıştırmaya gönderdiler. ancak run() işlemini yaptığında, mükemmel bir şekilde çalışır. 'un nasıl başardıklarını bilmek istiyorum, paralel python ile iletişim kurmak daha mı iyi? –

İlgili konular