【Java】使用Java调用Python的四种方法
寫在前面
為啥一個好好的崗位是Java開發工程師要去做寫python呢?因為產品經理安排的(突然多少有點明白為啥程序員和產品經理會一直開撕)。由于在選擇企業的時候沒看清企業性質,看了要求以為就是互聯網企業,現在看看初為社畜的我還是太天真了。不過既然這幾天已經在寫python腳本了,那也不能浪費這段時間的經歷了,畢竟python的閃光點也不少。于是想一下如何與老本行Java聯系起來,就有了這篇博文。
文章目錄
- 寫在前面
- 一、在java類中直接執行python語句
- 二、在java中直接調用python腳本
- 三、★★★使用Runtime.getRuntime()執行python腳本文件,推薦使用
- 四、調用python腳本中的函數
其實調用的方法也不難,具體調用方法有如下四種(如果有其他辦法記得在評論區留下呀):
在使用Java調用python之前,需要導入依賴環境。如,在maven項目中,需要導入如下依賴
<dependency><groupId>org.python</groupId><artifactId>jython-standalone</artifactId><!--python版本是2.x還是3.x在這里指定--><version>2.7.0</version> </dependency>一、在java類中直接執行python語句
在Java類中調用python語句的方法如下
import org.python.util.PythonInterpreter public class JavaRunPython {public static void main(String[] args) {//首先調用python的解釋器PythonInterpreter interpreter = new PythonInterpreter();//選擇執行的的Python語句interpreter.exec("a='hello world'; ");interpreter.exec("print a;");} }這種方法用的不多、也不推薦大家使用。這里為了整個文章內容的完成性,我把這種方法放在這里。(控制臺出現“ Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0”的紅標時,不是出錯了,而是兼容沒做好,可以去運行配置中的Arguments中輸入
-Dpython.console.encoding=UTF-8)
在正常的情況下,Java工程師只需要調用python開發工程師寫的腳本就行了,不會再在代碼中加入python語句了。因為在Java語言中添加入其他語言,使Java的可讀性下降、執行意義也不是很大(為了一兩行代碼,去導入python包的性價比太低;而且如果行數多了,就應該是集合成腳本并執行腳本了)
二、在java中直接調用python腳本
這種方式是有些Java程序員使用調用。首先將準備好的腳本,如plus.py
a = 1 b = 2 print a + b則在Java中運行的模式是這樣的:
import org.python.util.PythonInterpreter; public class JavaPythonFile {public static void main(String[] args) {PythonInterpreter interpreter = new PythonInterpreter();//我在這里使用相對路徑,注意區分interpreter.execfile("./plus.py");} }三、★★★使用Runtime.getRuntime()執行python腳本文件,推薦使用
為什么推薦使用這種方式來調用python腳本呢?
答:由于這種辦法可以讓進程與程序交互??梢钥吹匠霈F的問題,便于解決
如還是調用上面的腳本為例
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class RuntimeFunction {public static void main(String[] args) {Process proc;try {/*附加:String[] args1=new String[]{"/home/huan/anaconda2/bin/python","/home/huan/myfile/pythonfile/helloword.py"};Process pr=Runtime.getRuntime().exec(args1);String數組里的那一行很重要首先一定要設置好你所使用的python的位置,切記不要直接使用python,因為系統會默認使用自帶的python,所以一定要設置好你所使用的python的位置,否則可能會出現意想不到的問題(比如說我使用的是anaconda中的python,而ubuntu系統會默認調用自帶的python,而我自帶的python中并沒有numpy庫,所以會造成相應的代碼不會執行的問題,所以設置好python的位置是很重要的)。還有就是要設置好py文件的位置,使用絕對路徑。在這里插入代碼片還有就是可以看出,此方法可以滿足我們python代碼中調用第三方庫的情況,簡單實用。*/proc = Runtime.getRuntime().exec("python ./plus.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();} } }對以上代碼的解釋
首先,為什么要創建Process proc。我們可以去看官方文檔:
The ProcessBuilder.start() and Runtime.exec methods create a native process and return an instance of a subclass of Process that can be used to control the process and obtain information about it. The class Process provides methods for performing input from the process, performing output to the process, waiting for the process to complete, checking the exit status of the process, and destroying (killing) the process.
這段文字的意思是: ProcessBuilder.start()和Runtime.exec兩個方法會生成一個本地的進程,然后返回一個Processs子類的實例。通過這個實例可以控制進程以及獲得關于進程的信息。這個Process類為進程提供可用于執行來自的輸入的方法,然后執行輸出到這個進程中,等待完成后,檢查進程退出時的狀態,然后停止這個進程?!獡Q句話說,這個實例就是監視整個進程的。
通過Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到輸入輸出流,然后通過InputStream可以得到程序對控制臺的輸出信息,通過OutputStream可以給程序輸入指令,這樣就達到了程序的交換功能。
四、調用python腳本中的函數
改造一下python腳本,注意嚴格的縮進。
def add(a,b):a = 1b = 2print a + breturn a+b調用的代碼
import org.python.core.PyFunction; import org.python.core.PyInteger; import org.python.core.PyObject; import org.python.util.PythonInterpreter; public class Function {public static void main(String[] args) {PythonInterpreter interpreter = new PythonInterpreter();interpreter.execfile("./plus.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);}}參考文獻:
java調用python的幾種用法(看這篇就夠了)
在Java中調用Python
java調用python代碼
總結
以上是生活随笔為你收集整理的【Java】使用Java调用Python的四种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】【入门】一文带你掌握Py
- 下一篇: websocket python爬虫_p