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);
}
posted @ 2021-06-17 21:17  johnny233  阅读(40)  评论(0编辑  收藏  举报  来源