AttributeError с Pyro4
Я пытаюсь отправить объект с Pyro4. Это мой код сервера:
class Player(object):
def __init__(self, name='', clazz=C_SPEC):
self.name = 'name'
class Game(object):
def playeradd(self):
'''Add spectator'''
player = Player()
ob = cPickle.dumps(player);
return ob
theGame = Game()
with Pyro4.core.Daemon() as daemon:
uri = daemon.register(theGame)
print uri
daemon.requestLoop()
И мой клиент выглядит так:
game = Pyro4.core.Proxy('PYRO:obj_ffbed0ab21894952ba941246fa5e1365@localhost:59639')
pl= cPickle.loads(str(game.playeradd()))
print pl
Я получаю эту ошибку: AttributeError: у объекта 'module' нет атрибута 'Player'
Есть мнение?
1 ответ
Вы не можете просто распаковать засоленный объект в своем клиентском коде. Как и во всех рассолах, только состояние объекта подвергается засечке и передается по проводам. Чтобы его распаковать, ваш код должен иметь доступ к тому же классу в том же модуле, с которого поступил объект на стороне сервера. Т.е. вам придется продублировать модуль, где ваш Player
Объект определяется как на клиенте, так и на сервере.
Тем не менее, я думаю, что вы действительно хотите достичь чего-то другого: кажется, что вы хотите создать зрителя на своем сервере и взаимодействовать с ним из своего клиентского кода. Это не может быть сделано так, как вы пытаетесь здесь: объект в вашем клиенте будет копией и будет независим от того, который вы выбрали на вашем сервере. Вам придется вернуть прокси вместо фактического объекта (или его части). Но я предлагаю вам взглянуть на механизм авто- прокси Pyro4. Смотрите https://pythonhosted.org/Pyro4/servercode.html, а также смотрите autoproxy
пример, который идет с Pyro4.