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的相關問題都已描述清楚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM