我正在尝试使用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”显示,没有任何反应。
由于
答案 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以来,此错误将被正确报告回客户端,并且不会再中断连接。