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