首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyro4,接收:数据不足

Pyro4,接收:数据不足
EN

Stack Overflow用户
提问于 2015-02-14 13:37:52
回答 1查看 1.9K关注 0票数 2

我试图使用Pyro4在服务器上运行一个函数。查看代码:==========================Client======================

代码语言:javascript
复制
import Pyro4
def square(x): 
    return x**2
remoteServer = Pyro4.Proxy('PYRONAME:server')
print(remoteServer.evaluate(square, 4))

===========================Server==========================

代码语言:javascript
复制
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()

========================Naming Server========================

代码语言:javascript
复制
import Pyro4
Pyro4.naming.startNSloop()

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

并得到一个错误:"Pyro4.errors.ConnectionClosedError:接收:没有足够的数据“。查看下面的完整堆栈跟踪:

代码语言:javascript
复制
    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,Python3.4.1

我发现了类似的问题(How to send a function to a remote Pyro object),但对我没有用。尝试使用回调装饰器@per4.回调,但即使是官方示例(https://github.com/delmic/Pyro4/tree/master/examples/callback:server2.py,client2.py)也没有工作(使用python3.4和python2.7),只显示了=>消息:“服务器:对客户端执行回调1”,什么也没有发生。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-14 18:36:50

你链接到的github回购不是官方的。这是一个克隆人(从一个相当古老的版本)。这是官方回购:https://github.com/irmen/Pyro4

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

客户端崩溃的原因是服务器由于Pyro协议错误而中止连接。如果启用日志记录,它将显示在服务器的日志文件中,类似于:"Pyro4.errors.ProtocolError:不支持的序列化类: builtins.function“。

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

最后,@焦4.回调装饰是不相关的,请阅读http://pythonhosted.org/Pyro4/clientcode.html?highlight=callback#pyro-callbacks来了解它的意图。它影响Pyro处理异常的方式,仅此而已。

编辑:注意,由于Pyro 4.35将正确地将此错误报告给客户端,并且它将不再获得中止的连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28516184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档