py4j可以使python和java互调

py4j并不会开启jvm,需要先启动jvm server,然后再使用python的client去连接jvm

GatewayServer实例:允许python程序通过本地网络socket来与JVM通信。

1、安装:pip install py4j

其中Python库会安装到Python目录,而Java库会安装到对应的目录,如/usr/local/share/py4j/py4j0.10.5.jar。​

2、启动Java虚拟机

要让Python代码调用JVM函数,需要先使用Py4J的Java库,启动一个JVM监听socket端口,代码如下,其中py4j.GatewayServer在前面安装得到的py4j0.10.5.jar包中。

AdditionApplication.java

import py4j.GatewayServer;
public class AdditionApplication { public int addition(int first, int second) {
return first + second;
} public static void main(String[] args) {
AdditionApplication app = new AdditionApplication();
// app is now the gateway.entry_point
GatewayServer server = new GatewayServer(app);
  //GatewayServer server = new GatewayServer(app,25334); //使用其他端口
server.start(); //开始接收python请求
}
}

编译:

​javac -cp /usr/local/share/py4j/py4j0.10.5.jar  AdditionApplication.java

运行:默认会使用25333端口,可以lsof -i:25333进行查看

java -cp /usr/local/share/py4j/py4j0.10.5.jar:. AdditionApplication​

启动Python客户端

最后启动Python客户端就可以,通过Py4J提供的Python库,根据ip、port连接JVM启动的socket server,然后就可以使用Java实现的类了,而且类的属性和成员函数都可以dynamic使用。

>>> from py4j.java_gateway import JavaGateway

>>> gateway = JavaGateway()                   # connect to the JVM ,初始化一个JavaGateway,默认为localhost,端口25333

使用java自带的库
>>> random = gateway.jvm.java.util.Random() # create a java.util.Random instance >>> number1 = random.nextInt(10) # call the Random.nextInt method >>> number2 = random.nextInt(10) >>> print(number1,number2) (2, 7)
使用AdditionApplication服务的函数 >>> addition_app = gateway.entry_point # get the AdditionApplication instance >>> addition_app.addition(number1,number2) # call the addition method 9 如果要使用第三方的包,必须在运行时先包含进来,然后才可以使用:
引用第三方包my.jar,并使用里面的方法cn.huawei.tongdun.Add

java -cp /usr/local/share/py4j/py4j0.10.5.jar:/usr/local/my.jar:. AdditionApplication​

third_add = gateway.jvm.cn.huawei.tongdun.Add

刚开始,遇到找不到类的情况时,我想着把需要的jar包放入CLASSPATH下,但是失败告终

总结

Py4J​为Python调用JVM程序提供了很简易的接口,为Java/Scala应用提供Python API提供便利。Spark基于Py4J实现了PySpark也非常好用,在实际开发中除了启动GatewayServer,还需要处理多线程并发、SparkContext封装等工作。

类似Py4J,如果需要Python​调用C/C++后端,还可以使用swig,参考 TensorFlow 的实现。​​​​

 

参考:

1、https://weibo.com/ttarticle/p/show?id=2309404123715523750791&mod=zwenzhang

2、http://blog.csdn.net/u010159842/article/details/69251773

3、https://www.py4j.org/install.html#install-instructions

4、https://www.py4j.org/faq.html#how-to-import-a-class

在python里调用java的py4j的使用方法的更多相关文章

  1. PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。

    PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...

  2. 在ORACLE触发器里调用JAVA程序

    因为项目需要,有一个已经写好的Java程序,想要在Oracle某个表的触发器中调用,以使得每次数据更新时,调用这个JAVA程序,来修改后台某个数据. 现将过程记录如下: 1.编写JAVA程序 publ ...

  3. [转载]C#控制台应用程序里调用自己写的函数的方法

    (2011-08-15 15:52:13) 转载▼ 标签: 转载 分类: 技术类 原文地址:C#控制台应用程序里调用自己写的函数的方法作者:萧儿 最近写程序,遇到了一个很白痴的问题,记录下来,免得下次 ...

  4. 第4篇-JVM终于开始调用Java主类的main()方法啦

    在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看gene ...

  5. 第29篇-调用Java主类的main()方法

    在第1篇中大概介绍过Java中主类方法main()的调用过程,这一篇介绍的详细一点,大概的调用过程如下图所示. 其中浅红色的函数由主线程执行,而另外的浅绿色部分由另外一个线程执行,这个线程最终也会负责 ...

  6. Python中调用Java程序包

    <原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 开发Python程序,需求中需要用到Java代 ...

  7. JPype:实现在python中调用JAVA

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  8. [Python]Python3调用java代码

    环境:Ubuntu16.04 桌面版 Ubuntu安装java的详细教程:https://www.cnblogs.com/ttkl/p/11933884.html 安装JPype1 pip3 inst ...

  9. 第2篇-JVM虚拟机这样来调用Java主类的main()方法

    在前一篇 第1篇-关于JVM运行时,开篇说的简单些 中介绍了call_static().call_virtual()等函数的作用,这些函数会调用JavaCalls::call()函数.我们看Java类 ...

随机推荐

  1. Codeforces 725E Too Much Money (看题解)

    Too Much Money 最关键的一点就是这个贪心可以在sqrt(n)级别算出答案. 因为最多有sqrt(n)个不同的数值加入. 我们可以发现最优肯定加入一个. 然后维护一个当前可以取的最大值, ...

  2. gitlab之一: gitlab安装配置使用

    参考: gitlab 安装和配置 gitlab下载地址: https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/ 官方教程: https://about.gitl ...

  3. python3实现链表

    1.链表的实现 a.链表的结构为: b.链表的实现方法; #链表结构实现 私有属性_pro_item是指向下个节点的指针,_item为此节点的值 class ChainDemo(): def __in ...

  4. SSM知识点与整合之Spring知识点(pom.xml需要依赖的jar或者plugin)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. ML激活函数使用法则

    sigmoid .tanh .ReLu tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数. 基本已经不用 sigmoid 激活函数了,tanh 函数在所有场合都优于 sig ...

  6. Oracle中start with...connect by子句的用法

    http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html

  7. 用面向对象重写thread 实现多次调用一个线程

    思路: 利用thread类中,run方法在子线程中调用,其他方法在主线程调用,所以将生产者写入主线程,将消费者写入run函数中在子线程中执行,完成生产者消费者模型 注意: 1. 要在 init 函数中 ...

  8. 20165220Java实验四 Android程序设计

    一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:葛宇豪 学号:20165220 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:13:45 - 15:25 实验序号:实验 ...

  9. Codeforces 1095F Make It Connected 【MST】

    <题目链接> 题目大意: 给定一张n个顶点(每个顶点有点权)的无向图,并且给出边权为wi的m条边,顶点u和顶点v直接如果建边,边权为a_u + a_v,求图连通的最小边权和. 解题分析: ...

  10. BOM 和 DOM

    目录 一.BOM 1.什么是BOM 2. 浏览器内容划分 归BOM管的: 归DOM管的: 3. BOM常见方法 二.DOM 1 什么是DOM 2. DOM常见方法 一.BOM 1.什么是BOM BOM ...