`
angelbill3
  • 浏览: 256462 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Python Pyro4 - Python Remote Objects

阅读更多
在线文档: http://pythonhosted.org/Pyro4/intro.html

Pyro4,全名Python Remote Object。
学习这个库主要是因为工作需要在Java中调用Python。Pyro库的主要作用是让我们的应用可以在network下相互通信,是个轻量级的库。对于返回值的类型支持强大。并且Pyro是100%用Python写的,兼容任何版本的Python,包括3.x。
Pyro4发布超过15年了,而且现在还在持续更新。

关于Pyro4的特点,上文中的在线文档首页列了27条,就不一一列举了。生产环境有用到,并且没有出现过任何问题。

前提,需要先Install Pyro4 module: 可以通过pip工具进行下载安装。
Mac OS系统自带Python2.7,不过我自己又装了Python3.6,于是对应的pip命令也默认变pip3,具体如下:
>pip3 -V
>pip 9.0.1 from /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (python 3.6)
>pip3 install Pyro4

Log表明已经装好: Successfully installed Pyro4-4.56 serpent-1.19

示例1: python server <---- python client
例子在Pyro4的官网首页上就有,我这里只是拷贝测试下:

Server端代码: # saved as greeting-server.py
import Pyro4

@Pyro4.expose
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. Here is your fortune message:\n" \
               "Behold the warranty -- the bold print giveth and the fine print taketh away.".format(name)
daemon = Pyro4.Daemon()                # make a Pyro daemon
uri = daemon.register(GreetingMaker)   # register the greeting maker as a Pyro object
print("Ready. Object uri =", uri)      # print the uri so we can use it in the client later
daemon.requestLoop()                   # start the event loop of the server to wait for calls

运行后,输出: Ready. Object uri = PYRO:obj_73fa03c1a27b482195612fcd66357b3a@localhost:58672

客户端: # saved as greeting-client.py
import Pyro4

uri = input("What is the Pyro uri of the greeting object? ").strip()
name = input("What is your name? ").strip()
greeting_maker = Pyro4.Proxy(uri)         # get a Pyro proxy to the greeting object
print(greeting_maker.get_fortune(name))   # call method normally

运行后(若报错Connection refused,请看下文的问题1):
What is the Pyro uri of the greeting object? PYRO:obj_73fa03c1a27b482195612fcd66357b3a@localhost:58672
What is your name? allen
Hello, allen. Here is your fortune message:
Behold the warranty -- the bold print giveth and the fine print taketh away.


示例2: python server <---- java client
这里用到一个第三方库叫pyrolite-4.10.jar(最新版本是2017-02,v4.18),具体在线资源如下:
Github(大量例子及源码): https://github.com/irmen/Pyrolite
在线Python文档: http://pythonhosted.org/Pyro4/pyrolite.html
Maven仓库: https://mvnrepository.com/artifact/net.razorvine/pyrolite/4.10

用Maven的话会自动下载依赖,如需要自己添加,需加依赖: serpent-1.12.jar

具体例子,github上有,我拷贝下:
先是服务端(Python):
注:
1. 比第一个例子中的稍微复杂,是因为使用了name-server(可自定义,比url好记、方便)。
2. 注解@Pyro4.expose表示要暴露的范围,若加在class前面说明里面所有的方法都可以被客户端所调用,若加在单个方法中,那么其它方法对外则不可见。
3. 加了security: hmac,这段代码只是起到安全作用,可不写,具体参见: http://pythonhosted.org/Pyro4/security.html
4. 设了最简单的String参数,当然其它类型的也都可以支持。

import Pyro4

class GreetingMakerJava(object):
    @Pyro4.expose
    def get_fortune(self, name):
        return "Hello, " + name;

daemon = Pyro4.core.Daemon()                # make a Pyro daemond
daemon._pyroHmacKey = b'demokey'

ns = Pyro4.locateNS()                       # find the name server
uri = daemon.register(GreetingMakerJava)    # register the greeting maker as a Pyro object
ns.register("example.greeting", uri)        # register the object with a name in the name server

print("Ready.")
print(list(ns.list(prefix="example.").keys()))
daemon.requestLoop()                        # start the event loop of the server to wait for calls


Java客户端:
import net.razorvine.pyro.Config;
import net.razorvine.pyro.NameServerProxy;
import net.razorvine.pyro.PyroProxy;
public class TestPython {
	public static void main(String[] args) throws Exception {
		Config.METADATA = false; // Pyro4.56 have some bugs to get metadata.
	    NameServerProxy ns = NameServerProxy.locateNS(null);
	    PyroProxy remoteobject = new PyroProxy(ns.lookup("example.greeting"));
	    remoteobject.pyroHmacKey = "demokey".getBytes();
	    Object result = remoteobject.call("get_fortune", "allen");
	    String message = (String)result;
	    System.out.println("result message=" + message);
	    remoteobject.close();
	    ns.close();
	}
}
// result message=Hello, allen


-------------------------------------------------------------------------
使用过程中遇到的问题:

1. 在运行第1个例子的客户端,遇到错误: ConnectionRefusedError: [Errno 61] Connection refused
需要打开python的name service:
>python3 -m Pyro4.naming
Not starting broadcast server for localhost.
NS running on localhost:9090 (127.0.0.1)
Warning: HMAC key not set. Anyone can connect to this server!
URI = PYRO:Pyro.NameServer@localhost:9090

参考: http://stackoverflow.com/questions/34499331/pyro4-failed-to-locate-the-nameserver

2. 在运行第2个例子的客户端,遇到错误: Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.HashSet

尝试解决,加上Config.METADATA = false;
分享到:
评论

相关推荐

    Python库 | Pyro4-4.43.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:Pyro4-4.43.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | Pyro4-4.42-py2.py3-none-any.whl

    Pyro4的核心是其远程方法调用(Remote Procedure Call, RPC),这使得开发者可以像操作本地对象一样操作远程对象,大大简化了跨网络的对象通信。 **Pyro4核心概念** 1. **代理(Proxy)**: 代理是Pyro4的核心组件...

    PyPI 官网下载 | Pyro4-4.14.tar.gz

    Pyro4,作为一个在Python社区广泛应用的库,是Python远程对象访问(Remote Object Protocol)的一个强大实现。它允许程序员通过网络进行进程间通信(IPC),使得分布式计算变得简单而高效。Pyro4-4.14.tar.gz是这个...

    PyPI 官网下载 | Pyro4-4.79-py2.py3-none-any.whl

    Pyro4是一个功能强大的Python对象远程方法调用(Remote Method Invocation, RMI)库,它允许你在网络上进行分布式计算。通过Pyro4,你可以将一个Python对象的方法调用透明地跨越网络发送到另一个计算机上执行,就像...

    PyPI 官网下载 | Pyro4-4.58-py2.py3-none-any.whl

    Pyro4 是一个强大的Python远程对象调用(Remote Object Invocation,ROI)框架,它允许开发者在Python程序之间进行进程间通信(Inter-Process Communication, IPC)。Pyro4 提供了一种透明的方式,使得在不同的进程...

    PyPI 官网下载 | Pyro4-4.48.tar.gz

    《Pyro4-4.48:Python远程对象代理库详解》 Pyro4是一个强大的Python库,用于实现远程过程调用(RPC)和对象透明的分布式计算。Pyro4-4.48是该库的一个版本,它封装了网络通信细节,允许Python对象在不同的进程或...

    PyPI 官网下载 | pyro-ppl-1.3.0.tar.gz

    在这个资源包“pyro-ppl-1.3.0.tar.gz”中,我们关注的是名为Pyro的Python库,其版本为1.3.0。本文将深入探讨Pyro库的背景、功能、应用场景以及如何安装和使用。 Pyro库,全称Pyro - Probabilistic Programming ...

    PyPI 官网下载 | Pyro4-4.42-py2.py3-none-any.whl

    资源来自pypi官网。 资源全名:Pyro4-4.42-py2.py3-none-any.whl

    Pyro-Module-Python-Introduction.zip_pyro

    **Pyro 模块 Python 入门指南** Pyro 是一个功能强大的 Python 库,用于构建分布式系统,尤其是用于创建动态、灵活的网络应用程序。它提供了远程过程调用(RPC)框架,允许程序在不同机器间共享对象和执行任务。...

    Python库 | pyro_ppl-0.5.1-py3-none-any.whl

    python库。资源全名:pyro_ppl-0.5.1-py3-none-any.whl

    pyro-ppl-feedstock:一个关于pyro-ppl的conda-smithy仓库

    关于pyro-ppl 主页: : 软件包许可证:Apache-2.0 原料许可证: 简介:一个用于概率建模和推理的Python库 开发: : 说明文件: : 当前构建状态 所有平台: 当前发行信息 姓名 资料下载 版本 平台类 安装...

    Laravel开发-pyro-repeater-validators

    在这个特定的项目"laravel-development-pyro-repeater-validators"中,我们关注的是Pyrocms 3中的"中继器"字段类型及其验证器。 "中继器"字段类型是Pyrocms的一个特色功能,它允许用户在表单中动态添加和管理多个...

    Pyro - PYthon ROguelike-开源

    **Pyro - PYthon ROguelike 开源项目** Pyro是一个独特的开源项目,它旨在创建一个完全由Python编程语言构建的Roguelike游戏。Roguelike是一种深受玩家喜爱的游戏类型,以其随机生成的关卡、永久死亡机制以及深度...

    Python库 | PyROA-2.0.2.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:PyROA-2.0.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python-基于NumpyJAXJIT的Pyro深度概率编程

    总的来说,“Python-基于Numpy/JAX/JIT的Pyro深度概率编程”是一个深入探讨如何利用现代Python库来实现高效概率编程的主题。它涵盖了从基础的数值计算到高级的模型训练和优化的全过程,对于希望在机器学习和数据科学...

    Pyro4:Pyro 4.x-Python远程对象

    PYRO-Python远程对象 通过Pyro,您可以构建应用程序,使对象可以通过网络以最小的编程工作量彼此对话。 您可以只使用普通的Python方法调用来调用其他计算机上的对象。 Pyro是一个纯Python库,因此它可以在许多不同的...

Global site tag (gtag.js) - Google Analytics