java 调用python脚本的方法 java调用python脚本文件

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

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

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

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


 org.python
 jython-standalone
 2.7.0	

然后代码如下

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可以给程序输入指令,这样就达到了程序的交换功能。


 

作者:我吃那桌小孩原文地址:https://blog.csdn.net/qq_52074153/article/details/126254603

%s 个评论

要回复文章请先登录注册