AttributeError: объект 'модуля' не имеет никакого атрибута (при использовании cPickle)

Я пытаюсь загрузить функцию в удаленной среде с помощью 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'
17
задан Dave Webb 29 July 2010 в 14:06
поделиться

2 ответа

Из http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled :

Обратите внимание, что функции (встроенные и определяемые пользователем) обрабатываются «полностью квалифицированная »ссылка на имя, а не ценность. Это означает, что только имя функции мариновано, вместе с имя модуля функция определено в. Ни одна из функций код, ни какая-либо его функция атрибуты маринованы. Таким образом определяющий модуль должен быть импортируемым в неприглядная среда и модуль должен содержать названный объект, в противном случае возникнет исключение.

Вы удалили ссылку на fun1 в модуле, определяющем fun1, и это ошибка.

9
ответ дан 30 November 2019 в 13:33
поделиться

Имя модуля функции сохраняется в pickle, когда вы выполняете загрузки , он ищет fun1 в __ main __ или где бы то ни было изначально

1
ответ дан 30 November 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: