您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘Pjava編寫的界面如何調(diào)用python,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
如何使用Java調(diào)用Python程序
本文為大家介紹如何java調(diào)用python方法,供大家參考。
實際工程項目中可能會用到Java和python兩種語言結合進行,這樣就會涉及到一個問題,就是怎么用Java程序來調(diào)用已經(jīng)寫好的python腳本呢,一共有三種方法可以實現(xiàn),具體方法分別為大家介紹:
1. 在java類中直接執(zhí)行python語句
此方法需要引用org.python包,需要下載Jpython。在這里先介紹一下Jpython。下面引入百科的解釋:
Jython是一種完整的語言,而不是一個Java翻譯器或僅僅是一個Python編譯器,它是一個Python語言在Java中的完全實現(xiàn)。Jython也有很多從CPython中繼承的模塊庫。最有趣的事情是Jython不像CPython或其他任何高級語言,它提供了對其實現(xiàn)語言的一切存取。所以Jython不僅給你提供了Python的庫,同時也提供了所有的Java類。這使其有一個巨大的資源庫。
這里我建議下載最新版本的Jpython,因為可以使用的python函數(shù)庫會比老版本的多些,目前最新版本為2.7。
下載jar包請點擊Download Jython 2.7.0 - Standalone Jar
下載安裝程序請點擊Download Jython 2.7.0 - Installer
如果使用maven依賴添加的話,使用下面的語句:
<dependency> <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> <version>2.7.0</version> </dependency>
以上準備好了,就可以直接在java類中寫python語句了,具體代碼如下:
PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("a=[5,2,3,9,4,0]; "); interpreter.exec("print(sorted(a));"); //此處python語句是3.x版本的語法 interpreter.exec("print sorted(a);"); //此處是python語句是2.x版本的語法
輸出結果如下:
這里會看到輸出的結果都是一樣的,也就是說Jpython兼容python2.x和3.x版本的語句,運行速度會比直接運行python程序稍慢一點。
但是每次運行結果都會提示console: Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0. 這樣看起來很煩,因為每次運行結果都會出現(xiàn)紅色的提示語句,以為是錯誤,程序員應該都不愿意看到這一幕,得想個辦法解決。
解決方法如下:
在要執(zhí)行的代碼上右鍵, Run As>Run Configurations,選擇第二個頁簽Arguments,在VM arguments中添加以下語句
-Dpython.console.encoding=UTF-8
然后Apply->Run就可以了。
如下圖所示:
2. 在java中調(diào)用本地python腳本
首先在本地建立一個python腳本,命名為add.py,寫了一個簡單的兩個數(shù)做加法的函數(shù),代碼如下:
def add(a,b): return a + b
python的功能函數(shù)已經(jīng)寫好,接下來我們寫一個java的測試類(同樣需要用到Jpython包),來測試一下是否可以運行成功。代碼如下:
import org.python.core.PyFunction; import org.python.core.PyInteger; import org.python.core.PyObject; import org.python.util.PythonInterpreter; public class Java_Python_test { public static void main(String[] args) { // TODO Auto-generated method stub PythonInterpreter interpreter = new PythonInterpreter(); interpreter.execfile("D:\\add.py"); // 第一個參數(shù)為期望獲得的函數(shù)(變量)的名字,第二個參數(shù)為期望返回的對象類型 PyFunction pyFunction = interpreter.get("add", PyFunction.class); int a = 5, b = 10; //調(diào)用函數(shù),如果函數(shù)需要參數(shù),在Java中必須先將參數(shù)轉化為對應的“Python類型” PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); System.out.println("the anwser is: " + pyobj); } }
運行結果如圖所示:
注意:以上兩個方法雖然都可以調(diào)用python程序,但是使用Jpython調(diào)用的python庫不是很多,如果你用以上兩個方法調(diào)用,而python的程序中使用到第三方庫,這時就會報錯java ImportError: No module named xxx。遇到這種情況推薦使用下面的方法,即可解決該問題。
3. 使用Runtime.getRuntime()執(zhí)行腳本文件(推薦)
為了驗證該方法可以運行含有python第三方庫的程序,我們先寫一個簡單的python腳本,代碼如下:
import numpy as np a = np.arange(12).reshape(3,4) print(a)
可以看到程序中用到了numpy第三方庫,并初始化了一個3×4的一個矩陣。
下面來看看怎么用Runtime.getRuntime()方法來調(diào)用python程序并輸出該結果,java代碼如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Demo1 { public static void main(String[] args) { // TODO Auto-generated method stub Process proc; try { proc = Runtime.getRuntime().exec("python D:\\demo1.py");// 執(zhí)行py文件 //用輸入輸出流來截取結果 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); proc.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
輸出的結果如下圖所示:
可以看到運行成功了,但有的朋友可能會問了,怎么在python程序中函數(shù)傳遞參數(shù)并執(zhí)行出結果,下面我就舉一例來說明一下。
先寫一個python的程序,代碼如下:
import sys def func(a,b): return (a+b) if __name__ == '__main__': a = [] for i in range(1, len(sys.argv)): a.append((int(sys.argv[i]))) print(func(a[0],a[1]))
其中sys.argv用于獲取參數(shù)url1,url2等。而sys.argv[0]代表python程序名,所以列表從1開始讀取參數(shù)。
以上代碼實現(xiàn)一個兩個數(shù)做加法的程序,下面看看在java中怎么傳遞函數(shù)參數(shù),代碼如下:
int a = 18; int b = 23; try { String[] args = new String[] { "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) }; Process proc = Runtime.getRuntime().exec(args);// 執(zhí)行py文件 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); proc.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }
其中args是String[] { “python”,path,url1,url2 }; ,path是python程序所在的路徑,url1是參數(shù)1,url2是參數(shù)2,以此類推。
最后結果如圖所示:
OK,成功了。
上述就是小編為大家分享的java編寫的界面如何調(diào)用python了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。