Java调用Python相关问题:指定python环境、传入参数、返回结果 - 落跃之城

时间:2024-03-04 19:56:06

Java调用Python相关问题:指定python环境、传入参数、返回结果

本篇文章涉及到的操作均在Windows系统下进行,Java调用python在原理上不难,但是可能在实际应用中会有各种各样的需求,网上其他的资料很不全,所以又总结了这篇文章,以供参考。

一、指定python运行环境

首先,如果是python脚本中需要用到第三方库,则最好要用Runtime.getRuntime().exec的方法来从Java中调用python,本文章也都是基于这种方法,这也相当于是在控制台通过语句来调用python文件;其次,实际使用的时候经常会需要调用不同的python环境,比如python2.x和3.x,不同的python运行环境安装了不同的库,对应着不同的python脚本,这个时候就需要在Java调用语句中指定python环境了。

一般情况下,是不指定python环境,而通过以下几句来调用python文件:

 1 String pyPath = "E:\\CalCentralFeature.py"; //python文件路径
 2 String[] args = new String[] { "python", pyPath};  //设定命令行
 3 try {    
 4             Process proc = Runtime.getRuntime().exec(args);  //执行py文件
 5             BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));     
 6             String line = null;
 7             while ((line = in.readLine()) != null) {
 8                 System.out.println(line);
 9             }
10             in.close();
11             proc.waitFor();
12         } catch (Exception e) {
13             e.printStackTrace();
14         }

由于设定命令行部分没有指定具体的python环境,所以运行的时候会调用系统默认的python环境,也就是添加到系统环境变量中的python。查看系统默认python版本,可以在cmd中直接键入python回车即可。

如果需要指定python运行环境,则需要在设定命令行部分进行更改,比如我的系统默认python是2.7的,而我其他地方安装了python3.7,里面已经安装好了需要的第三方库,需要Java中调用python文件时指定运行环境是这个python3.7。那么只需将上面的第二行更改如下:

1 String[] args = new String[] { "F:\\Program Files\\Python37\\python", pyPath};

python3.7安装路径如下图所示:

下面的调用函数还都是一样,这样即可指定python的运行环境。

二、传入参数

在Java中调用python时如果需要传入参数,则还是通过更改String[] args = new String[]这句函数,将参数添加在后面即可,比如:

1 String[] args = new String[] { "F:\\Program Files\\Python37\\python", pyPath, data1,data2};

这样就是传入了data1和data2两个运行参数,当然运行参数个数不限。

在Java中设定好了之后,还需要在python文件中做相应更改:

1 import sys
2 
3 def cal_central_feature(x,y):
4      x_records = BaseFunction.get_attr_records(sf,x)
5      y_records = BaseFunction.get_attr_records(sf,y)
6      ...........
7 
8 if __name__ == \'__main__\':
9      result = cal_central_feature(sys.argv[1],sys.argv[2])

首先是需要引用sys,传入的参数用sys.argv[1]、sys.argv[2]表示。其中需要注意的是接收参数从sys.argv[1]开始,sys.argv[0]是python脚本的参数地址,没有实际作用。

三、返回结果

Java调用python时,不能通过return语句来获取返回值,而只能通过print将结果写入到标准输出流中,然后在Java中通过标准输入流来读取到返回结果。

因此,如果想得到返回结果,就需要在python文件中做修改,通过print函数将需要的结果返回到Java程序中。

python中的示例如下:

1 if __name__ == \'__main__\':
2      result = cal_central_feature(sys.argv[1],sys.argv[2])
3      print(result[0])
4      print(result[1])

这样就是返回了result[0]和result[1]两个返回值,在Java中通过如下语句得到返回值:

 1 String result = null;
 2 try {    
 3       Process proc = Runtime.getRuntime().exec(args);  //执行py文件
 4       BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));     
 5       String line = null;
 6       while ((line = in.readLine()) != null) {
 7                 System.out.println(line);
 8                 result += line;
 9             }
10       in.close();
11       proc.waitFor();
12       } catch (Exception e) {
13              e.printStackTrace();
14       }

其中第7行表示将结果打印出来,第8行表示将结果保存到string中。

至此,在Java中调用python的相关问题都已描述清楚。