本篇文章涉及到的操作均在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的相關問題都已描述清楚。
