Я пытаюсь загрузить функцию в удаленной среде с помощью 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'
Из http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled :
Обратите внимание, что функции (встроенные и определяемые пользователем) обрабатываются «полностью квалифицированная »ссылка на имя, а не ценность. Это означает, что только имя функции мариновано, вместе с имя модуля функция определено в. Ни одна из функций код, ни какая-либо его функция атрибуты маринованы. Таким образом определяющий модуль должен быть импортируемым в неприглядная среда и модуль должен содержать названный объект, в противном случае возникнет исключение.
Вы удалили ссылку на fun1 в модуле, определяющем fun1, и это ошибка.
Имя модуля функции сохраняется в pickle, когда вы выполняете загрузки
, он ищет fun1
в __ main __
или где бы то ни было изначально