摘要:首先是直接通過(guò)調(diào)用代碼。先寫個(gè)代碼文件,它位于盤中,其完整代碼如下該代碼接受兩個(gè)命令行參數(shù),然后輸出一個(gè)乘法算式。
??對(duì)于一個(gè)數(shù)據(jù)分析方面的工作者來(lái)說(shuō),最熟悉的語(yǔ)言無(wú)疑就是Python了。對(duì)于軟件開發(fā)者而言,Java又是極其重要的工具。那么,一個(gè)很自然的問(wèn)題就是,我們能夠在Java中調(diào)用Python代碼嗎?
??想要在Java中調(diào)用Python代碼,有以下兩個(gè)辦法:
直接通過(guò)Runtime進(jìn)行調(diào)用
調(diào)用Jython
在Java中如果需要調(diào)用第三方程序,可以直接通過(guò)Runtime實(shí)現(xiàn),這也是最直接最粗暴的做法,粒度更加粗糙,效率較高,需要安裝Python軟件。而Jython是Python語(yǔ)言在Java平臺(tái)的實(shí)現(xiàn),可以理解為一個(gè)由 Java 語(yǔ)言編寫的 Python 解釋器,因此,不需要安裝Python軟件。它不僅提供了Python的庫(kù),同時(shí)也提供了所有的Java類,這就使得其有一個(gè)巨大的資源庫(kù)。Jython可以直接調(diào)用Python程序中的指定函數(shù)或者對(duì)象方法,粒度更加精細(xì)。但遺憾的是,Jython運(yùn)行速度并不理想。
??接下來(lái),我們將分別介紹以上兩種調(diào)用方法。
??首先是直接通過(guò)Runtime調(diào)用Python代碼。先寫個(gè)Python代碼文件test_argv.py,它位于D盤中,其完整代碼如下:
import sys a = sys.argv[1] b = sys.argv[2] print("%s * %s = %s"%(a,b,int(a)*int(b)))
該P(yáng)ython代碼接受兩個(gè)命令行參數(shù),然后輸出一個(gè)乘法算式。調(diào)用的Java代碼如下:
package javaCode; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; public class TestPython { public static void main(String[] args) throws Exception { Scanner input = new Scanner(System.in); // 在同一行輸入兩個(gè)數(shù)字,用空格分開,作為傳入Python代碼的命令行參數(shù) System.out.println("Enter two integers(e.g. 12 34): "); String integers = input.nextLine(); String[] numbers = integers.split(" "); // 定義傳入Python腳本的命令行參數(shù),將參數(shù)放入字符串?dāng)?shù)組里 String cmds = String.format("python D://test_argv.py %s %s", numbers[0], numbers[1]); // 執(zhí)行CMD命令 System.out.println(" Executing python script file now."); Process pcs = Runtime.getRuntime().exec(cmds); pcs.waitFor(); // 定義Python腳本的返回值 String result = null; // 獲取CMD的返回流 BufferedInputStream in = new BufferedInputStream(pcs.getInputStream()); // 字符流轉(zhuǎn)換字節(jié)流 BufferedReader br = new BufferedReader(new InputStreamReader(in)); // 這里也可以輸出文本日志 String lineStr = null; while ((lineStr = br.readLine()) != null) { result = lineStr; } // 關(guān)閉輸入流 br.close(); in.close(); System.out.println(result); } }
從以上代碼中,可以發(fā)現(xiàn),我們往Python代碼中傳入了兩個(gè)命令行參數(shù)(兩個(gè)整數(shù)),通過(guò)Java提供的Runtime環(huán)境讓Python執(zhí)行程序,最后用Java得到在CMD或shell中的輸出流并在Java程序輸出,本質(zhì)上還是Python在處理計(jì)算結(jié)果。其輸出如下圖所示:
??然后我們將演示如何使用Jython來(lái)實(shí)現(xiàn)類似上述程序的功能。
??Jython的MVN倉(cāng)庫(kù)地址為http://mvnrepository.com/arti..., API官方網(wǎng)址為: http://www.jython.org/javadoc/, jar的下載地址為: http://www.jython.org/downloa... . 下載jython-standalone-2.7.0.jar包,并將其加入到Eclipse的Java Build Path中,如下圖:
Java代碼如下:
package javaCode; import org.python.util.PythonInterpreter; public class TestPython { public static void main(String args[]) { PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("import sys "); interpreter.exec("a = input("Enter a:")"); interpreter.exec("b = input("Enter b:")"); interpreter.exec("print("%s * %s = %s" %(a, b, a*b))"); } }
運(yùn)行以上程序,結(jié)果如下圖:
??至此,我們成功地用以上兩種方法在Java中調(diào)用了Python代碼。
??本次分享到此結(jié)束,歡迎大家交流~~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69023.html
摘要:首先是直接通過(guò)調(diào)用代碼。先寫個(gè)代碼文件,它位于盤中,其完整代碼如下該代碼接受兩個(gè)命令行參數(shù),然后輸出一個(gè)乘法算式。 ??對(duì)于一個(gè)數(shù)據(jù)分析方面的工作者來(lái)說(shuō),最熟悉的語(yǔ)言無(wú)疑就是Python了。對(duì)于軟件開發(fā)者而言,Java又是極其重要的工具。那么,一個(gè)很自然的問(wèn)題就是,我們能夠在Java中調(diào)用Python代碼嗎???想要在Java中調(diào)用Python代碼,有以下兩個(gè)辦法: 直接通過(guò)Runt...
摘要:引上下文管理器太極生兩儀,兩儀為陰陽(yáng)。而最常用的則是,即上下文管理器使用上下文管理器用之后的文件讀寫會(huì)變成我們看到用了之后,代碼沒有了創(chuàng)建,也沒有了釋放。實(shí)現(xiàn)上下文管理器我們先感性地對(duì)進(jìn)行猜測(cè)。現(xiàn)實(shí)一個(gè)上下文管理器就是這么簡(jiǎn)單。 Python有什么好學(xué)的這句話可不是反問(wèn)句,而是問(wèn)句哦。 主要是煎魚覺得太多的人覺得Python的語(yǔ)法較為簡(jiǎn)單,寫出來(lái)的代碼只要符合邏輯,不需要太多的學(xué)習(xí)即可...
摘要:的類行為是的類行為的子集,目前尚不支持優(yōu)先級(jí)線程組,線程無(wú)法銷毀停止暫停恢復(fù)或中斷。表示繼承創(chuàng)建該線程的當(dāng)前線程的屬性。重入鎖,同步原語(yǔ)的一種,可由同一線程多次獲取已持有的鎖。 threading在低級(jí)的_thread模塊上構(gòu)建了更高級(jí)的線程接口。 threading模塊基于Java線程模型設(shè)計(jì)。不過(guò)Java中鎖和條件變量是每個(gè)對(duì)象的基本行為,在python中卻是單獨(dú)的對(duì)象。pytho...
閱讀 2425·2021-09-01 10:41
閱讀 1445·2019-08-30 14:12
閱讀 512·2019-08-29 12:32
閱讀 2862·2019-08-29 12:25
閱讀 2937·2019-08-28 18:30
閱讀 1710·2019-08-26 11:47
閱讀 983·2019-08-26 10:35
閱讀 2593·2019-08-23 18:06