如何获得XMLRPC服务器(python2.7.3)的输出?

2024-09-19 14:19:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我从python网站得到了XMLRPC服务器/客户端。当我在Windows中运行pow()、add()、div()等简单方法时,客户机可以正确地获得结果。但是,当我运行brocade()时,它使用python模块(PyCrypto,Paramiko)从brocade交换机获取配置信息,并将字符串输出作为返回值返回,大约需要2-3秒(根据switch命令可能需要更长的时间)。我观察到服务器正确执行并打印输出,但是客户机收到如下消息。在

C:\CVS\Python\MyTestProject\src>python xmlrpcclient2.py
8
5
2
Traceback (most recent call last):
  File "xmlrpcclient2.py", line 8, in <module>
    print s.brocade('sh ver')
  File "c:\Python27\lib\xmlrpclib.py", line 1224, in __call__
    return self.__send(self.__name, args)
  File "c:\Python27\lib\xmlrpclib.py", line 1578, in __request
    verbose=self.__verbose
  File "c:\Python27\lib\xmlrpclib.py", line 1264, in request
    return self.single_request(host, handler, request_body, verbose)
  File "c:\Python27\lib\xmlrpclib.py", line 1297, in single_request
    return self.parse_response(response)
  File "c:\Python27\lib\xmlrpclib.py", line 1473, in parse_response
    return u.close()
  File "c:\Python27\lib\xmlrpclib.py", line 793, in close
    raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: "<type 'exceptions.TypeError'>:cannot marshal None unless allow_none is enabled">

服务器显示

^{pr2}$

您知道客户端如何获得brocade()的结果吗?在

谢谢你, 火花。在

xmlrpcserver2.py

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)

# Create server
listening_port = 8002
server = SimpleXMLRPCServer(("localhost", listening_port),
                           requestHandler=RequestHandler)
print "Listening on port %d..." % listening_port
server.register_multicall_functions()                           
server.register_introspection_functions()

# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)

# Register a function under a different name
def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')

def brocade(str):
    import brocade
    return brocade.MySwitch().do_something_cool(str)
server.register_function(brocade, 'brocade')

# Register an instance; all the methods of the instance are
# published as XML-RPC methods (in this case, just 'div').
class MyFuncs:
    def div(self, x, y):
        return x // y
server.register_instance(MyFuncs())

# Run the server's main loop
server.serve_forever()

xmlrpcclient2.py

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8002')

print s.pow(2,3)  # Returns 2**3 = 8
print s.add(2,3)  # Returns 5
print s.div(5,2)  # Returns 5//2 = 2
print s.brocade('sh ver')

Tags: inpyselfregisterreturnserverlibline
1条回答
网友
1楼 · 发布于 2024-09-19 14:19:44

XMLRPC在技术上不允许空值,当您尝试序列化None时,它正确地告诉您它不能。许多XMLRPC服务都违反了这一细节,并以通常可以理解的方式发送它们。要在python中启用此行为,请将allow_none=True传递给服务器代码中的^{}或客户端中的^{}的构造函数。

server = SimpleXMLRPCServer(("localhost", listening_port),
                            requestHandler=RequestHandler,
                            allow_none=True) 

以及

^{pr2}$

相关问题 更多 >