1

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' object has no attribute 'Player'

何か意見はありますか?

4

1 に答える 1

1

クライアント コードでピクルされたオブジェクトをアンピクルすることはできません。すべての pickle と同様に、オブジェクトの状態のみが pickle 化され、ネットワーク経由で送信されます。それをアンピクルするには、サーバー側でオブジェクトが取得されたのと同じモジュール内の同じクラスにコードがアクセスできる必要があります。Playerつまり、クライアントとサーバーの両方でオブジェクトが定義されているモジュールを複製する必要があります。

しかし、私はあなたが本当に何か他のことを達成したいと思っていると思います: サーバーで観戦プレイヤーを作成し、クライアント コードからそれと対話したいようです。これは、ここで試みている方法では実行できません。クライアントのオブジェクトは、サーバーでピクルしたオブジェクトのコピーであり、独立しています。実際のオブジェクト (またはそのピクル) の代わりにプロキシを返す必要があります。しかし、Pyro4 のautoproxyメカニズムを調べることをお勧めします。https://pythonhosted.org/Pyro4/servercode.html#autoproxyingを参照autoproxyし、Pyro4 に付属の例も参照してください。

于 2015-12-11T21:48:50.987 に答える