2014-09-03 173 views
-2

有人可以解釋我,我怎麼能返回pyro4中的複雜對象? ,這裏是我的代碼....和輸出。 我的cody很簡單,我只想返回客戶端中的複雜對象。我不想只返回那樣的字符串,數字或者字母。 SERVER(greeting.py)pyro4返回複雜對象

import Pyro4 
from lib import obj 

class GreetingMaker(object): 
    def get_obj(): 
     return obj() 
    factory = staticmethod(get_obj) 


if __name__=="__main__": 
    greeting_maker=GreetingMaker() 
    daemon=Pyro4.Daemon()     # make a Pyro daemon 
    ns=Pyro4.locateNS()     # find the name server 
    uri=daemon.register(greeting_maker) # register the greeting object as a Pyro object 
    ns.register("example.greeting", uri) # register the object with a name in the name server 

    print "Ready." 
    daemon.requestLoop()     # start the event loop of the server to wait for calls 

LIB(lib.py)

class obj(object): 
    dato = 'thing' 

CLIENT(client.py)

import Pyro4 
from lib import obj 
if __name__=="__main__": 
    greeting_maker=Pyro4.Proxy("PYRONAME:example.greeting") # use name server object lookup uri  shortcut 
    a = greeting_maker.factory() 

OUTPUT客戶

Traceback (most recent call last): 
    File "client.py", line 6, in <module> 
    a = greeting_maker.factory() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Pyro4/core.py", line 168, in __call__ 
    return self.__send(self.__name, args, kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Pyro4/core.py", line 366, in _pyroInvoke 
    data = serializer.deserializeData(msg.data, compressed=msg.flags & message.FLAGS_COMPRESSED) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Pyro4/util.py", line 162, in deserializeData 
    return self.loads(data) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Pyro4/util.py", line 461, in loads 
    return self.recreate_classes(serpent.loads(data)) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Pyro4/util.py", line 370, in recreate_classes 
    return self.dict_to_class(literal) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Pyro4/util.py", line 349, in dict_to_class 
    raise Pyro4.errors.ProtocolError("unsupported serialized class: " + classname) 
Pyro4.errors.ProtocolError: unsupported serialized class: lib.obj 

我想要返回客戶端中複雜的對象:/

感謝


碼刷新:) 現在我有其他錯誤:S

+0

焦不能老是這個序列化對象或沒有人?_ _main_ _.object? – xXcoronaXx 2014-09-03 18:18:46

+0

刪除我的評論,因爲他們是不正確的。檢查下面的答案。 – 2014-09-03 18:36:09

回答

0

objecto被定義在同一文件中使用的類。當文件運行時,您會注意到一些有趣的內容:它的模塊名稱設置爲__main__。例如,試試這個...

文件1(test_module.py):

class test(object): 
    pass 

if __name__ == '__main__': 
    a = test() 
    print a.__class__ 

接下來,創建第二個文件:

import test_module 

a = test_module.test() 
print a.__class__ 

你會看到,類名的前綴是其模塊名稱。作爲安全防範措施,Pyro4不允許運行在__main__範圍內創建的對象。 objectoGreetingMaker應該放在他們自己的文件中。

您可以瞭解更多有關Python的命名空間在這裏:https://docs.python.org/2/tutorial/classes.html

而且你可以看到爲什麼錯誤在這裏拋出:爲什麼objeto是https://github.com/irmen/Pyro4/blob/master/src/Pyro4/util.py#L291-L298

+0

感謝您的解釋,但我真的很想知道如何返回一個複雜的對象(服務器 - >客戶端)? – xXcoronaXx 2014-09-03 18:54:45

+0

@corona你期望你提供的代碼來做到這一點嗎?如果是這樣,修復錯誤(我解釋了該怎麼做),看看它是否有效。 – 2014-09-03 19:36:53

+0

完成後,我不知道我是否可以將複雜的對象返回給客戶端,能否向我解釋我應該怎麼做 – xXcoronaXx 2014-09-03 21:37:06