我试图使用Pyro4在服务器上运行一个函数。查看代码:==========================Client======================
import Pyro4
def square(x):
return x**2
remoteServer = Pyro4.Proxy('PYRONAME:server')
print(remoteServer.evaluate(square, 4))===========================Server==========================
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========================
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,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”,什么也没有发生。
谢谢
发布于 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将正确地将此错误报告给客户端,并且它将不再获得中止的连接。
https://stackoverflow.com/questions/28516184
复制相似问题