Pyro4 的属性错误

AttributeError with 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'

有什么意见吗?

您不能只在客户端代码中取消腌制对象。 与所有 pickle 一样,只有对象的 state 被 pickle 并通过网络发送。要解开它,您的代码需要能够访问同一模块中的相同 class,因为对象来自服务器端。 IE。您必须复制在客户端和服务器上定义 Player 对象的模块。

但是,我认为您确实想实现其他目标:您似乎想在服务器中创建一个观看播放器并从您的客户端代码与其交互。这不能按照您在此处尝试的方式完成:客户端中的对象将是您在服务器中腌制的对象的副本并独立于该对象。您必须 return 一个 代理 而不是实际的对象(或它的泡菜)。但我建议您查看 Pyro4 的 autoproxy 机制。请参阅 https://pythonhosted.org/Pyro4/servercode.html#autoproxying 以及 Pyro4 附带的 autoproxy 示例。