【问题标题】:Python SimpleXMLRPCServer return valuePython SimpleXMLRPCServer 返回值
【发布时间】:2015-09-16 00:36:05
【问题描述】:

我刚开始使用 XMLRPC 服务器和客户端将我的树莓派连接到计算机。

我的服务器如下所示:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
import numpy as np

allow_reuse_address = True   
ip = '...'
port = 8000  

class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)  

server = SimpleXMLRPCServer((ip, port), requestHandler=RequestHandler)
server.register_introspection_functions() 

def Spectrum():
    data = ... # it's a numpy array
    return data

server.register_function(Spectrum, 'Spectrum')  
server.serve_forever()

我的客户是这样的:

#!/usr/bin/env python

import xmlrpclib
import numpy as np

[...]

def getSpectrum():
try:
    s = xmlrpclib.ServerProxy(server)
    v = s.Spectrum()
    print v         

except:
    print "no data"

我的服务器正在运行,我的测试功能显示它可以工作。但是我的函数 getSpectrum() 总是抛出异常。我发现如果我的返回值是浮点数而不是 numpy 数组,它可以正常工作:

def Spectrum():
    data = ... # it's a numpy array
    return float(data[0][0])

我不知道出了什么问题,但我认为应该可以返回一个 numpy 数组。你知道怎么解决吗?

【问题讨论】:

    标签: python numpy return-value simplexmlrpcserver


    【解决方案1】:

    xmlrpclib 仅支持标准 python 类型的编组。 numpy 数组是一种扩展类型,因此不能开箱即用地序列化。一个简单的解决方案是返回 numpy 数组的列表表示形式,当您收到数据时,您再次将其转换为 numpy 数组:

    def Spectrum():
        data = ... # it's a numpy array
        return data.tolist()
    ...
    def getSpectrum():
        try:
            s = xmlrpclib.ServerProxy(server)
            v = numpy.asarray(s.Spectrum())
            ...
    

    【讨论】:

    • 这是一个非常简单的解决方法!转换为列表并返回 numpy 数组需要一些时间,但不到 500 毫秒。感谢您的快速帮助。
    猜你喜欢
    • 2016-02-05
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2010-09-12
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多