2014-09-03 170 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