Java执行Python脚本
概述
术业有专攻,Java适合做企业级平台应用,或者云计算,大数据相关平台等。Python则擅长于小工具应用。
两种方式
Runtime
根据有无入参
无入参
public static void testPythonWithRuntime() {
Process proc;
try {
proc = Runtime.getRuntime().exec("python D:\\demo1.py");
// 用输入输出流来截取结果
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
有入参
public static void testPythonWithRuntime1() {
int a = 18;
int b = 23;
try {
String[] args = new String[]{"python", "D:\\demo.py", String.valueOf(a), String.valueOf(b)};
Process proc = Runtime.getRuntime().exec(args);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
优缺点
无需额外引入依赖
Jython
Jpython简介:一种完整的语言,而不仅仅是一个Java翻译器或Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。
引入依赖:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.2</version>
</dependency>
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a=[5,2,3,9,4,0]; ");
interpreter.exec("print(sorted(a));");// python 3.x 语法
interpreter.exec("print sorted(a);");// python 2.x 语法
执行脚本示例代码:
public static void testPythonWithJython() {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("E:\\saveAsPic.py");
// 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
PyFunction pyFunction = interpreter.get("add", PyFunction.class);
// 调用有参函数,必须先将参数转化为对应的Python类型
PyObject pyobj = pyFunction.__call__();
System.out.println("the anwser is: " + pyobj);
}