java 调用python脚本的方法

      这几天老师要求我作项目时使用Java调取python脚本得到值,搜索几天,现在记录一下

1. 直接在java类里面执行python语句

     一开始我就是搜索的此方法,但这个方法我自己认为没有什么比较大的意义,但还是贴上来

我用的是springboot来开发项目,要先导入maven依赖

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.0</version>	
</dependency>

然后代码如下

import org.python.util.PythonInterpreter
public class JavaRunPython {
    public static void main(String[] args) {
    	//首先调用python的解释器
        PythonInterpreter interpreter = new PythonInterpreter();
        //选择执行的的Python语句
        interpreter.exec("print ("hello java调用python");
    }
}

2.  java调取python脚本

       此方法python脚本中不能引入其他的库(比如cv2,numpy等,当初在这里面耗了好久)

此方法依然要引入jython依赖。

先给出python代码:

def add(a, b):
    return a + b

java代码如下:

PythonInterpreter interpreter = new PythonInterpreter();        interpreter.execfile("python文件的绝对地址");
// 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
PyFunction pyFunction = interpreter.get("add", PyFunction.class);
//调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
PyObject pyobj = pyFunction.__call__(new PyString("hello"), new PyString("java"));
System.out.println("the anwser is: " + pyobj);

3. ***使用Runtime.getRuntime()执行python文件,极度推荐

         此方法可以使用其他库,可以传递参数,也可以使用输出流获取输出值

先给出Java代码:

        try {
            String[] args1 = new String[] { "python", "python文件的绝对地址", "参数一", "参数二" };
            Process proc = Runtime.getRuntime().exec(args1);// 执行py文件
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            proc.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

python代码:

import sys
#导入sys库用来接收参数


def add(a, b):
    return a + b


if __name__ == '__main__':
    a = []

#用循环向数组a中添加参数,自动过滤前两个
    for i in range(1, len(sys.argv)):
        a.append((sys.argv[i]))
    add(a[0],a[1])

Java代码如果在idea中无法运行,string数组中第一个值可以写成python.exe的绝对地址,亲测有效。

再说说Runtime.getRuntime()

官方文档对其的说明:

             ProcessBuilder.start()和Runtime.exec两个方法会生成一个本地的进程,然后返回一个Processs子类的实例。通过这个实例可以控制进程以及获得关于进程的信息。这个Process类为进程提供可用于执行来自的输入的方法,然后执行输出到这个进程中,等待完成后,检查进程退出时的状态,然后停止这个进程。——换句话说,这个实例就是监视整个进程的。

            通过Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能。


 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年3月10日
下一篇 2023年3月10日

相关推荐