pyro4 返回复杂对象
有人能告诉我,如何在pyro4中返回一个复杂的对象吗?这是我的代码……还有输出结果。
我的代码很简单,我只想在客户端返回复杂的对象。我不想只返回字符串、数字或类似的东西。
服务器部分(greeting.py)
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.py)
class obj(object):
dato = 'thing'
客户端部分(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()
客户端输出
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
1 个回答
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__
这个范围内运行创建的对象。因此,objecto
和GreetingMaker
应该放在各自的文件里。
你可以在这里了解更多关于Python命名空间的内容:https://docs.python.org/2/tutorial/classes.html
你也可以在这里查看为什么会抛出错误:https://github.com/irmen/Pyro4/blob/master/src/Pyro4/util.py#L291-L298