java編寫的介面可以呼叫python嗎
如何使用Java呼叫Python程式
本文為大家介紹如何java呼叫python方法,供大家參考。
實際工程專案中可能會用到Java和python兩種語言結合進行,這樣就會涉及到一個問題,就是怎麼用Java程式來呼叫已經寫好的python指令碼呢,一共有三種方法可以實現,具體方法分別為大家介紹:
1. 在java類中直接執行python語句
此方法需要引用org.python包,需要下載Jpython。在這裡先介紹一下Jpython。下面引入百科的解釋:
Jython是一種完整的語言,而不是一個Java翻譯器或僅僅是一個Python編譯器,它是一個Python語言在Java中的完全實現。Jython也有很多從CPython中繼承的模組庫。最有趣的事情是Jython不像CPython或其他任何高階語言,它提供了對其實現語言的一切存取。所以Jython不僅給你提供了Python的庫,同時也提供了所有的Java類。這使其有一個巨大的資源庫。
這裡我建議下載最新版本的Jpython,因為可以使用的python函式庫會比老版本的多些,目前最新版本為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. 這樣看起來很煩,因為每次執行結果都會出現紅色的提示語句,以為是錯誤,程式設計師應該都不願意看到這一幕,得想個辦法解決。
解決方法如下:
在要執行的程式碼上右鍵, Run As>Run Configurations,選擇第二個頁籤Arguments,在VM arguments中新增以下語句
-Dpython.console.encoding=UTF-8
然後Apply->Run就可以了。
如下圖所示:
2. 在java中呼叫本地python指令碼
首先在本地建立一個python指令碼,命名為add.py,寫了一個簡單的兩個數做加法的函式,程式碼如下:
def add(a,b): return a + b
python的功能函式已經寫好,接下來我們寫一個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"); // 第一個引數為期望獲得的函式(變數)的名字,第二個引數為期望返回的物件型別 PyFunction pyFunction = interpreter.get("add", PyFunction.class); int a = 5, b = 10; //呼叫函式,如果函式需要引數,在Java中必須先將引數轉化為對應的“Python型別” PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); System.out.println("the anwser is: " + pyobj); } }
執行結果如圖所示:
注意:以上兩個方法雖然都可以呼叫python程式,但是使用Jpython呼叫的python庫不是很多,如果你用以上兩個方法呼叫,而python的程式中使用到第三方庫,這時就會報錯java ImportError: No module named xxx。遇到這種情況推薦使用下面的方法,即可解決該問題。
3. 使用Runtime.getRuntime()執行指令碼檔案(推薦)
為了驗證該方法可以執行含有python第三方庫的程式,我們先寫一個簡單的python指令碼,程式碼如下:
import numpy as np a = np.arange(12).reshape(3,4) print(a)
可以看到程式中用到了numpy第三方庫,並初始化了一個3×4的一個矩陣。
下面來看看怎麼用Runtime.getRuntime()方法來呼叫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");// 執行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程式中函式傳遞引數並執行出結果,下面我就舉一例來說明一下。
先寫一個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用於獲取引數url1,url2等。而sys.argv[0]代表python程式名,所以列表從1開始讀取引數。
以上程式碼實現一個兩個數做加法的程式,下面看看在java中怎麼傳遞函式引數,程式碼如下:
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);// 執行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是引數1,url2是引數2,以此類推。
最後結果如圖所示:
OK,成功了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3407/viewspace-2836229/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python turtle 模組可以編寫遊戲,是真的嗎?Python遊戲
- sublime可以寫python嗎Python
- Python呼叫C++編寫的方法PythonC++
- java可以像python中的函式式工具裡的reduce那樣呼叫嗎?JavaPython函式
- httpfetch-一款java語言編寫優雅的http介面呼叫元件HTTPJava元件
- springboot java呼叫flask python寫的Spring BootJavaFlaskPython
- 如何優雅的編寫Java介面(安全性,可重複呼叫,穩定性,追溯性)Java
- python可以用百度api介面嗎?PythonAPI
- 一個基於Java的介面快速開發框架!無需編寫程式碼,透過UI介面編寫介面!Java框架UI
- 在SLSB呼叫後的java類寫多執行緒可以麼?Java執行緒
- 基於順豐同城介面編寫sdk,java三方sdk編寫思路Java
- 反射可以取到原始呼叫方法的變數名嗎?反射變數
- 編寫註冊介面
- 使用Delphi呼叫C++編寫的DLLC++
- C#呼叫c++編寫的dllC#C++
- [譯]編寫可以複用的 HTML 模板HTML
- SlimPhp框架的使用(二)編寫介面PHP框架
- java呼叫python簡單函式介面的具體教程JavaPython函式
- RestSharp編寫api介面測試,並實現非同步呼叫(不卡頓)RESTAPI非同步
- Java可以自學嗎?自學能學好嗎?Java
- python+flask 編寫一個簡單的登入介面例子PythonFlask
- python+flask編寫一個簡單的登入介面例子PythonFlask
- react,vue編寫介面文件ReactVue
- 使用python呼叫新浪微博介面Python
- JAVA中的註解可以繼承嗎?Java繼承
- 兩個不同的web系統之間可以呼叫程式嗎Web
- python可以開發遊戲嗎Python開發遊戲
- Python可以開發APP嗎?PythonAPP
- 支付寶介面呼叫 -- JAVA版Java
- 呼叫java介面的方式有哪些?Java
- 沒想到吧,Java開發 API介面可以不用寫 Controller了JavaAPIController
- Java程式編寫Java
- 在linux系統中,手動編寫java程式碼,將介面打成jar供其他程式呼叫,實現方式LinuxJavaJAR
- 用PHP編寫登陸介面PHP
- 學習Python需要培訓嗎?可以自學嗎?Python
- [Java 基礎]--呼叫webservice介面的方法JavaWeb
- 使用Python編寫一個QQ辦公版的圖形登入介面!Python
- 寫在開始編寫Java之前(2)——Java的環境Java