1. 程式人生 > 實用技巧 >Java之呼叫Python程式碼 轉載:https://mp.weixin.qq.com/s/cr8dXzwsQhtei9TfXwcMcA

Java之呼叫Python程式碼 轉載:https://mp.weixin.qq.com/s/cr8dXzwsQhtei9TfXwcMcA

對於一個數據分析方面的工作者來說,最熟悉的語言無疑就是Python了。對於軟體開發者而言,Java又是極其重要的工具。那麼,一個很自然的問題就是,我們能夠在Java中呼叫Python程式碼嗎?
  想要在Java中呼叫Python程式碼,有以下兩個辦法:

  • 直接通過Runtime進行呼叫

  • 呼叫Jython

在Java中如果需要呼叫第三方程式,可以直接通過Runtime實現,這也是最直接最粗暴的做法,粒度更加粗糙,效率較高,需要安裝Python軟體。而Jython是Python語言在Java平臺的實現,可以理解為一個由 Java 語言編寫的 Python 直譯器,因此,不需要安裝Python軟體。它不僅提供了Python的庫,同時也提供了所有的Java類,這就使得其有一個巨大的資源庫。Jython可以直接呼叫Python程式中的指定函式或者物件方法,粒度更加精細。但遺憾的是,Jython執行速度並不理想。

  接下來,我們將分別介紹以上兩種呼叫方法。
  首先是直接通過Runtime呼叫Python程式碼。先寫個Python程式碼檔案test_argv.py,它位於D盤中,其完整程式碼如下:

importsys

a=sys.argv[1]

b=sys.argv[2]

print("%s*%s=%s"%(a,b,int(a)*int(b)))

該Python程式碼接受兩個命令列引數,然後輸出一個乘法算式。呼叫的Java程式碼如下:

packagejavaCode;

importjava.io.BufferedInputStream;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.util.Scanner;

publicclassTestPython{

publicstaticvoidmain(String[]args)throwsException{

Scannerinput=newScanner(System.in);

//在同一行輸入兩個數字,用空格分開,作為傳入Python程式碼的命令列引數
System.out.println("Entertwointegers(e.g.1234):");
Stringintegers=input.nextLine();
String[]numbers=integers.split("");

//定義傳入Python指令碼的命令列引數,將引數放入字串數組裡
Stringcmds=String.format("pythonD://test_argv.py%s%s",
numbers[0],numbers[1]);

//執行CMD命令
System.out.println("\nExecutingpythonscriptfilenow.");
Processpcs=Runtime.getRuntime().exec(cmds);
pcs.waitFor();

//定義Python指令碼的返回值
Stringresult=null;
//獲取CMD的返回流
BufferedInputStreamin=newBufferedInputStream(pcs.getInputStream());
//字元流轉換位元組流
BufferedReaderbr=newBufferedReader(newInputStreamReader(in));
//這裡也可以輸出文字日誌

StringlineStr=null;
while((lineStr=br.readLine())!=null){
result=lineStr;
}
//關閉輸入流
br.close();
in.close();

System.out.println(result);

}
}

從以上程式碼中,可以發現,我們往Python程式碼中傳入了兩個命令列引數(兩個整數),通過Java提供的Runtime環境讓Python執行程式,最後用Java得到在CMD或shell中的輸出流並在Java程式輸出,本質上還是Python在處理計算結果。其輸出如下圖所示:

程式輸出結果

  然後我們將演示如何使用Jython來實現類似上述程式的功能。
  Jython的MVN倉庫地址為http://mvnrepository.com/artifact/org.python/jython/2.7.1b3, API官方網址為: http://www.jython.org/javadoc/, jar的下載地址為: http://www.jython.org/downloads.html . 下載jython-standalone-2.7.0.jar包,並將其加入到Eclipse的Java Build Path中,如下圖:

Java Build Path中加入jython-standalone-2.7.0.jar

Java程式碼如下:

packagejavaCode;

importorg.python.util.PythonInterpreter;

publicclassTestPython{
publicstaticvoidmain(Stringargs[]){
PythonInterpreterinterpreter=newPythonInterpreter();
interpreter.exec("importsys");
interpreter.exec("a=input('Entera:')");
interpreter.exec("b=input('Enterb:')");
interpreter.exec("print('%s*%s=%s'%(a,b,a*b))");
}
}

執行以上程式,結果如下圖:

執行結果


  至此,我們成功地用以上兩種方法在Java中呼叫了Python程式碼