天天看點

java調用python代碼接口_在Java中動态傳參調用Python腳本

最近,又接觸到一個奇葩的接口,基于老闆不斷催促趕時間的情況下,在重寫java接口和複用已有的python腳本的兩條路中選擇了後者,但是其實後者并沒有好很多,因為我是一個對python的認識僅限于其名稱拼寫的人,是以,我将把我這一天内從配置環境到最終剛成功調用腳本的過程整理一下,分享給大家。

首先,我先大體上整理一下我的思路(以下以py代替python):

1. py腳本如何運作?

2. java中如何調用py腳本?

3. 如何在java中向py腳本中動态傳參。

4. 運作釋出

接下來,我将順着以上三個方面的思路來分别介紹,并展示我是以踩過的坑。

一、 py腳本如何運作?

第一步當然是學習所有的語言都必備的:安裝環境,此處不再贅述,給大家一個我參考的部落格,非常詳細。windows下python環境的安裝

包括了安裝環境到簡單的運作語句等内容。

這樣的話,我在本地已經可以運作出已經寫好的py程式。

注意:這是我踩的第一個坑,在配置python環境時,要注意你目前運作的py腳本的版本,因為2.7和3.0兩個版本的相容不是很好,是以環境配置不相同時,可能會導緻寫好的py腳本出現文法錯誤,是以要注意這一點,選擇相應版本的安裝包。

二、java中如何調用py腳本?

關于java中如何調用py腳本,網上一搜就有很多種方法,我主要實踐了其中兩種,當然最後采用的一種也是有原因的,下文會詳細解釋。

1. 第一種,Jython

什麼是jython?

他其實是一門語言,并非是Java 或者Python的解釋器.用它可以實作,java和python代碼的互相通路。

如何使用jython?

如何使用Jython

所需jar包:

為什麼最終沒有選擇使用jython?

這是我踩過的第二個坑,上面引用的的jython教程,幾個例子都能很好的運作,函數傳參也非常友善,但在運作現有的demo.py時,卻一直在報下面這個錯:

java調用python代碼接口_在Java中動态傳參調用Python腳本

查詢過後,發現是java項目中引包不全的問題,但是基于我對py的了解之少,我放棄了這個內建好的方法,畢竟需要一點對py的了解。這個等以後有時間再做研究。

2.于是在放棄jython之後,我還是采用了java自帶的指令行執行py Runtime.getRuntime().exec(args),然後采用輸出流的方式用來擷取參數。

在封裝好的py腳本的情況下,如果你不需要傳入參數而隻需要執行這個py檔案的話,那麼直接百度就可以擷取得到很多寫好的代碼,我這裡提供一種我這次使用的:

try {

Process pr = Runtime.getRuntime().exec("python G:\\test.py");

BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

line = decodeUnicode(line);

System.out.println(line);

}

in.close();

pr.waitFor();

System.out.println("end");

} catch (Exception e) {

e.printStackTrace();

}

然後看到這裡,隻需要修改Runtime.getRuntime().exec(“”)中的參數改為自己相應的檔案路徑即可,就可以輕松結束本次分享,但是,總有但是,我們大多數情況下調用一個複用的部分,都是為了傳入不同的參數以擷取相應的結果,那麼請繼續往下看。

三、如何在java中向py腳本中動态傳參。

首先,先來一起明确一個概念,向腳本中動态傳參,我一開始就很難了解,一個java的參數如何轉為py的參數呢?但是,腳本就是可以直接用指令行運作的,具體是什麼意思呢?我也不太清楚,但是我在詢問不同人的不同方法之下,找到了一種自己能夠會用并且能夠了解的方法。具體參見:Python獲得指令行傳參

那麼一言不合上代碼吧:

Java代碼:

try {

//需傳入的參數

String a = getPara("car").substring(1), b = "D3455054", c = "LJ12GKS28D4418248", d = "qingdao";

System.out.println("start;;;" + a);

//設定指令行傳入參數

String[] args = new String[] { "python", "/api_test.py", a, b, c, d };

Process pr = Runtime.getRuntime().exec(args);

BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

line = decodeUnicode(line);

System.out.println(line);

}

in.close();

pr.waitFor();

System.out.println("end");

} catch (Exception e) {

e.printStackTrace();

}

py代碼:

import sys

print "腳本名:", sys.argv[0]

for i in range(1, len(sys.argv)):

print "參數", i, sys.argv[i]

運作結果:

java調用python代碼接口_在Java中動态傳參調用Python腳本

那麼,醬紫就大功告成啦。你隻需要根據py腳本中所需要的參數傳進去就好啦。

運作釋出

運作釋出有什麼好說的呢?

這裡也有一點需要注意的,就是伺服器環境的配置,linux一般都是內建好的,其他的我不太清楚,但是最重要的一點,在上線調試時,一定要注意py檔案的路徑存放問題。就醬。

總結

從一開始的完全摸不到頭腦,到現在能夠調用成功,這不到一天的時間,壓力卻是很大的,面對未知的知識,無從下手的感覺我想大家也都經曆過,但在這裡,我十分想感謝那些無私幫助我的旁友們~多交流一下,别人不一定有時間能幫你解決,但能夠提供思路的情況下,就能夠早一點找到正确的方向,比如”Python獲得指令行傳參“這個東西,我一開始真是連百度搜尋什麼都不知道,搜到的東西可能跟你需要的完全不搭邊,那麼有一個方向也是好的。當然,這個方向完全正确,奠定了後面動态傳參能夠成功的基礎,哈哈。

這個部落格隻顯示了我的一個特點:我不生産部落格,我隻是部落格的搬運工~

附錄:遺留問題

項目中擷取到的中文參數,一向py腳本中傳參就顯示亂碼,隻有中文出現這個情況,到目前也沒有找到解決方法,那麼現在采用了一種曲線救國的方式,但是非常的不好,然而目前并沒有發現更好的解決方法,放在這裡待以後繼續研究,或者大家能有什麼好方法也希望能夠多多交流~

原文位址:https://blog.csdn.net/thorny_v/article/details/61417386