Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有Pyro4的AttributeError_Python_Pyro - Fatal编程技术网

Python 带有Pyro4的AttributeError

Python 带有Pyro4的AttributeError,python,pyro,Python,Pyro,我正试图发送一个带有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

我正试图发送一个带有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:“模块”对象没有属性“玩家”


有什么意见吗?

您不能在客户端代码中取消pickle对象。 与所有pickle一样,只有对象的状态被pickle并通过导线发送。要取消勾选,您的代码需要能够访问来自服务器端的对象所在的同一模块中的同一类。 也就是说,您必须复制在客户端和服务器上都定义了
Player
对象的模块


然而,我认为您确实希望实现其他目标:似乎您希望在服务器中创建一个specting播放器,并通过客户端代码与之交互。这不能用您在这里尝试的方式来完成:客户机中的对象将是您在服务器中pickle的对象的副本,并且独立于您在服务器中pickle的对象。您必须返回一个代理,而不是实际的对象(或它的一个pickle)。但我建议你研究一下Pyro4的自氧化机制。请参阅并同时参阅Pyro4附带的
autoproxy
示例。

错误发生在哪一行?另外,您可以使用
Pyro4.Proxy(…)
Pyro4.Daemon()
而不是
Pyro4.core.Proxy
Pyro4.core.Daemon()
谢谢,我想我通过创建一个新的代理对象解决了这个问题。所以,是的,你是对的。