py4j的功能:py4j可以使pthon调用java的程序。
环境要求:
- 配置python环境,Py4J 已经用 Python 2.7、3.4、3.5、3.6 和 3.7 进行了测试。
- 配置java环境,版本最好1.7以上
目录
官方案例1 ——初识py4j
官方案例——在python中调用java编写的类
1 编写java代码
2 编写python代码
官方案例1 ——初识py4j
在python中调用java的方法,在调用java之前,请注意,在执行Python 代码之前,必须先启动 Java 程序。 f否则会这个错误:
Py4JNetworkError: An error occurred while trying to connect to the Java server (127.0.0.1:25333)
换句话说,Py4J 不会启动 JVM。
1 首先编写代码,并运行:
public class AdditionApplication {
public int addition(int first,int second){
return first + second;
}
public static void main(String[] args){
AdditionApplication app = new AdditionApplication();
GatewayServer server = new GatewayServer(app);
server.start();
}
}
运行程序,来启动jvm。
2 python调用程序
from py4j.java_gateway import JavaGateway gateway = JavaGateway()#和jVM的链接 #创建一个java.util.Random的实例 random = gateway.jvm.java.util.Random() #random = gateway.jvm.java.util.Random() number1 = random.nextInt(10) number2 = random.nextInt(10) print(number1,number2) #获取 AdditionApplication 实例 addition_app = gateway.entry_point #进行加法计算 value = addition_app.addition(number1,number2) print(value)
结果:
9 4 13
官方案例——在python中调用java编写的类
您将用 Java 编写一个简单的 Stack 类,然后编写一个访问堆栈的 Python 程序。
1 编写java代码
Stack类的主要方法包括:
- 将一个元素压入栈顶。
- 弹出栈顶元素。
- 获取包含堆栈的列表。
- 推送包含在列表中的所有元素。
import java.util.linkedList;
import java.util.List;
public class Stack {
private List internalList = new linkedList();
public void push(String element) {
internalList.add(0, element);
}
public String pop() {
return internalList.remove(0);
}
public List getInternalList() {
return internalList;
}
public void pushAll(List elements) {
for (String element : elements) {
this.push(element);
}
}
}
要想python访问java的内容,在java代码中需要开启相关服务,即运行python开启jvm。
允许 Python 程序访问预配置堆栈的入口点示例
public class StackEntryPoint {
private Stack stack;
public StackEntryPoint(){
Stack stack = new Stack();
stack.push("initial Item");
}
//为该类将提供对预配置堆栈的访问权限:
public Stack getStack(){
return stack;
}
public static void main(String[] args){
//开启jvm,并指定刚刚定义的类
GatewayServer gatewayServer = new GatewayServer(new StackEntryPoint(),25335);
//需要启动网关,以便它可以接受传入的 Python 请求:
gatewayServer.start();
System.out.println("Gateway Server Started");
}
}
运行:



