我试图用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'
有什么意见吗?
答案 0 :(得分:1)
您无法在客户端代码中取消选中pickle对象。
与所有泡菜一样,只有对象的状态被腌制并通过电线发送。要解开它,您的代码需要访问与服务器端对象相同的模块中的同一个类。
即您必须复制在客户端和服务器上定义Player
对象的模块。
但是,我认为你真的想要实现其他目标:你似乎想要在你的服务器中创建一个观众播放器,并通过你的客户端代码与它进行交互。这不能以您在此处尝试的方式完成:客户端中的对象将是您在服务器中腌制的对象的副本,并且独立于您在服务器中腌制的对象。您必须返回代理而不是实际对象(或其中的pickle)。但我建议你研究一下Pyro4的 autoproxy 机制。请参阅https://pythonhosted.org/Pyro4/servercode.html#autoproxying,另请参阅Pyro4附带的autoproxy
示例。