zoukankan      html  css  js  c++  java
  • 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的相关问题都已描述清楚。

  • 相关阅读:
    BZOJ3236:[AHOI2013]作业(莫队,分块)
    BZOJ5334:[TJOI2018]数学计算(线段树)
    BZOJ3173:[TJOI2013]最长上升子序列(Splay)
    BZOJ3211:花神游历各国(线段树)
    BZOJ3155:Preprefix sum(线段树)
    HDU5002:Tree(LCT)
    【BZOJ 1911】 [Apio2010]特别行动队
    【BZOJ 2875】 [Noi2012]随机数生成器
    【BZOJ 1054】 [HAOI2008]移动玩具
    【BZOJ 1497】 [NOI2006]最大获利
  • 原文地址:https://www.cnblogs.com/MatthewHome/p/10967945.html
Copyright © 2011-2022 走看看