Pyro4,接收:数据不够

时间:2015-02-14 13:37:53

标签: python-3.x pyro

我正在尝试使用Pyro4在服务器上运行一个函数。 看看代码: ==========================客户====================== < / p>

import Pyro4
def square(x): 
    return x**2
remoteServer = Pyro4.Proxy('PYRONAME:server')
print(remoteServer.evaluate(square, 4))

===========================服务器=================== =======

import Pyro4
class Server(object):
    def evaluate(self, func, args):
        return func(*args)

def main():
    server = Server()
    Pyro4.Daemon.serveSimple({server: "server"},ns=True)

if __name__ == '__main__':
    main()

========================命名服务器===================== ===

import Pyro4
Pyro4.naming.startNSloop()

=============================================== ============

收到错误:“ Pyro4.errors.ConnectionClosedError:接收:数据不够”。查看下面的完整堆栈跟踪:

    Traceback (most recent call last):
  File "C:\Users\Alex\Desktop\2.py", line 9, in <module>
    print(remoteServer.evaluate(square, 4))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 169, in __call__
    return self.__send(self.__name, args, kwargs)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\core.py", line 380, in _pyroInvoke
    msg = message.Message.recv(self._pyroConnection, [message.MSG_RESULT], hmac_key=self._pyroHmacKey)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\message.py", line 161, in recv
    msg = cls.from_header(connection.recv(cls.header_size))
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 460, in recv
    return receiveData(self.sock, size)
  File "C:\Users\Alex\AppData\Roaming\Python\Python34\site-packages\Pyro4\socketutil.py", line 195, in receiveData
    raise err
Pyro4.errors.ConnectionClosedError: receiving: not enough data

我希望服务器执行传递给方法(函数)的函数。

PS:Windows7, Python 3.4.1

我发现了类似的问题(How to send a function to a remote Pyro object),但对我没有用。 尝试使用回调装饰器@ pyro4.callback,但即使是官方示例(https://github.com/delmic/Pyro4/tree/master/examples/callback:server2.py,client2.py)也不起作用(使用python 3.4和python 2.7)=&gt;只有消息:“服务器:对客户端进行回调1”显示,没有任何反应。


由于

1 个答案:

答案 0 :(得分:1)

你链接的github repo不是官方的。它是一个克隆(来自相当旧的版本)。这是官方回购:https://github.com/irmen/Pyro4

关于您的问题:无法序列化功能并通过线路发送它们。如果你告诉Pyro使用pickle作为序列化协议,你可以做更多的技巧,但是pickle仍然需要在连接的两端都有模块源或字节码。

客户端崩溃的原因是服务器因Pyro协议错误而中止连接。如果启用日志记录,它将显示在服务器的日志文件中,例如:“Pyro4.errors.ProtocolError:unsupported serialized class:builtins.function”。

另外一个提示:您不必使用单独的源代码文件启动名称服务器。您可以直接从命令行启动它。

最后,@ pyro4.callback装饰器是无关的,请阅读http://pythonhosted.org/Pyro4/clientcode.html?highlight=callback#pyro-callbacks了解它的用途。它影响了Pyro处理异常的方式,仅此而已。

编辑:请注意,自Pyro 4.35以来,此错误将被正确报告回客户端,并且不会再中断连接。