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.

Другие вопросы по тегам