[solved] Pyro Klasseninstanzuebergabe

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hallo mal wieder...

ich hab hier ein Problem dabei, mit Pyro eine Klasseninstanz zu uebergeben.

Serverseitig ist das hier dabei wichtig:

Code: Alles auswählen

class MsgObj(object):
    def __init__(self, sender, receiver, type, data):
        self.sender = sender
        self.receiver = receiver
        self.type = type
        self.data = data
        self.timestamp = time.time()


class Messaging(Pyro.core.ObjBase):
    queues = dict()
    def __init__(self):
        Pyro.core.ObjBase.__init__(self)
    
    def hello_i_am(self, nick):
        self.caller = self.getLocalStorage().caller
        self.caller.nick = nick
        Messaging.queues[self.caller.nick] = Queue.Queue()
        print "hello from", self.caller.nick, "("+str(self.caller.addr)+")"
        return True
    
    def writeMessage(self, to, type, data):
        print self.caller.nick, "writes", data, "to", to
        msg = MsgObj(self.caller.addr, to, type, data)
        Messaging.queues[self.caller.nick].put(msg)
        return True
    
    def receiveMessages(self):
        print self.caller.nick, "receives his messages..."
        out = list()
        while not Messaging.queues[self.caller.nick].empty():
            out.append(Messaging.queues[self.caller.nick].get())
        return out
Veroeffentlicht wird die Klasse Messaging. Es ist kein Problem mit writeMessage eine Instanz von MsgObj zu erstellen. Aber wenn der Client dann versucht, die Methode receiveMessages aufzurufen, bekomm ich die Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "pE_Helpers.py", line 140, in on_mouse_click
    msg = f_chat.msg_server.receiveMessages()
  File "D:\Programme\Python25\Lib\site-packages\Pyro\core.py", line 390, in __call__
    return self.__send(self.__name, args, kwargs)
  File "D:\Programme\Python25\Lib\site-packages\Pyro\core.py", line 468, in _invokePYRO
    return self.adapter.remoteInvocation(name, constants.RIF_VarargsAndKeywords, vargs, kargs)
  File "D:\Programme\Python25\lib\site-packages\Pyro\protocol.py", line 416, in remoteInvocation
    answer = pickle.loads(answer)
AttributeError: 'module' object has no attribute 'MsgObj'
Was passiert da denn? Wenn ich zB direkte Attribute (also zB "MsgObj.data") uebergebe, funktioniert es problemlos.

EDIT: okay, nach einer Stunde joggen und ein bissl Google hab ich das Problem gefunden: http://pyro.sourceforge.net/manual/7-features.html ...aber die Loesung bleibt bisher noch unklar... mal schauen ob ichs noch hinbekommen. Ich bin also noch immer fuer Loesungsvorschlaege offen ;)

EDIT2: Okay, ich habs... das Objekt musste beidseitig verfuegbar gemacht werden. Ein einfaches "from Server import MsgObj" reichte nicht... wenn ich aber in der ClientKlasse MsgObj setze und im Server importiere, dann klappts ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten