2020-12-30

在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python的问题。

java调用python程序有几种思路:需要先搭建好 java 及 python 的编译执行环境。

1. 一个解决思路是在java项目中引入jython,然后使用python解释器运行jython代码

2. 在java程序中直接调用python程序,这样无论python程序引入什么样的库(模块),只要程序可以直接通过python xxx.py运行,则在Java程序中也能运行。下面重点介绍在Java中直接调用python程序的方法。java通过Runtime类调用python命令执行。

3. 通过python发布网址,java请求的方式调用。会占用网络资源。

4. 可能还有其他方法

1. 一个解决思路是在java项目中引入jython

然后使用python解释器运行jython代码

2. 在java程序中直接调用python程序

这样无论python程序引入什么样的库(模块),只要程序可以直接通过python xxx.py运行,则在Java程序中也能运行。下面重点介绍在Java中直接调用python程序的方法。

2.1 java中的核心代码,Runtime.getRuntime().exec(),如果python的入口函数不需要参数的话,可以直接将调用py文件的字符写入,示例

Runtime.getRuntime().exec(“python”,” D:\\pyworkspace\\main.py”)

2.2 需要注意的一些问题,要保证在命令行模式下,键入命令

python D:/pyworkspace/main.py

程序可以正常运行。也就是要保证有一个配置好的python环境。这个示例程序比较简单,如果是一个比较复杂的python项目,可能涉及到的模块比较多,用到的库也很多,需要将python环境配置完整,先在命令行下运行,无误后再在java程序中调用。

2.3 示例

1)我们要调用的python代码:

importsysdefmain(abc):print(abc)if __name__ == '__main__':for i in range(1, len(sys.argv)):
strs=sys.argv[i]
main(strs)

程序目录名称为D:/pyworkspace/main.py,函数main有参数,参数通过sys传入,也就是在java中定义好参数,然后通过sys,将参数传给main函数,把参数打印出来。

2)Java程序代码

importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;
publicclassMain {
public static void main(String[] args) {// TODO Auto-generated method stub
Process proc;try{
String[] args1= new String[] { "python", "D:\\pyworkspace\\main.py", "hello,test java and python"};
proc=Runtime.getRuntime().exec(args1);//用输入输出流来截取结果
BufferedReaderin =new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line=null;while ((line = in.readLine()) !=null) {
System.out.println(line);
}in.close();
proc.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

可以看到核心代码就是

String[] args1 = new String[] { "python", "D:\\pyworkspace\\main.py", "hello,test java and python"};
proc=Runtime.getRuntime().exec(args1);
Runtime.getRuntime().exec()的参数是一个字符串数组,相当于执行
python D:/pyworkspace/main.py,
往main.py中传递参数"hello,test java and python"。

3)运行结果

4.