Python實現(xiàn)調(diào)用jar或執(zhí)行java代碼的方法詳解
簡介
Python 作為一種靈活的軟件開發(fā)語言在當(dāng)今被廣泛使用。在軟件開發(fā)過程中,有時需要在 Python 項目中利用既有的 Java 代碼,已達(dá)到節(jié)省時間和開發(fā)成本的目的。因此,找到一個 Python 代碼調(diào)用 Java 代碼的橋梁是非常有意義的。 JPype 就是這樣的一個工具,利用它可以使 Python 程序方便的調(diào)用 Java 代碼。
JPype使Python可以完全訪問Java類庫。Jython/JPython重新實現(xiàn)了Python,JPype則提供了兩個虛擬機的接口。JPype可以在JSP,Servlet、RMI服務(wù)器和IDE插件都方面用Python代替Java。
缺陷:
package之外的類(在<default>中)不能被導(dǎo)入。
不能重啟JVM。
不能處理依賴當(dāng)前類的方法。
安裝jpype
pip install jpype1 conda install -c conda-forge jpype1
注意這兩個不能通用。如果使用pip安裝,在conda調(diào)用會出現(xiàn)import _jpype 未找到問題
java 代碼
import java.util.List; import java.io.*; import org.ansj.domain.Result; import org.ansj.domain.Term; import org.ansj.splitWord.analysis.ToAnalysis; public class jt { public static String formatDuring(long mss) { long days = mss / (1000 * 60 * 60 * 24); long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60); long seconds = (mss % (1000 * 60)) / 1000; return days+"days "+hours + ":" + minutes + ":" + seconds + "."+mss%1000; } public static void main(String[] args)throws IOException, Exception { System.out.println(args.length); run(); } public static void run(){ long start = System.currentTimeMillis(); System.out.println(formatDuring(start)); String str = " 原標(biāo)題:港媒:“日本制造”帶動日本制造 中國廠商赴日設(shè)立生產(chǎn)線 參考消息網(wǎng)9月3日報道 港媒稱,日本制造的產(chǎn)品一直以來受大眾追捧,近年,越來越多的中國工廠到日本設(shè)立生產(chǎn)線。截至今年3月,在日本設(shè)廠的中國內(nèi)地及香港廠商已達(dá)49家,是5年前的一倍?! ∠愀邸督?jīng)濟日報》網(wǎng)站8月30日援引美國《華爾街日報》報道稱,一家專門生產(chǎn)牙刷的上海企業(yè)于大坂設(shè)廠,并把產(chǎn)品銷售至內(nèi)地。該公司執(zhí)行總監(jiān)Wang Lin指出,中國人生活水平提升,消費者追求更好的產(chǎn)品,而內(nèi)地人一向?qū)θ毡井a(chǎn)品印象良好。該公司以前于內(nèi)地生產(chǎn)其他廉價牙刷品牌,但之后認(rèn)為能向中國消費者出售較高級的產(chǎn)品,故萌生于日本設(shè)廠的念頭?! 蟮婪Q,該公司目前每月出口5萬套牙刷到中國,每支售價為5美元,產(chǎn)品包裝上印有日文,并貼有中文翻譯。他認(rèn)為,在日本設(shè)廠的成本雖然較高,但產(chǎn)品會是貨真價實的日本貨。 此外,也有日本企業(yè)回流當(dāng)?shù)卦O(shè)廠?! 蟮婪Q,日本化妝品企業(yè)資生堂早年因日本國內(nèi)銷售下降,以致公司減低產(chǎn)能,由2004年6家日本工廠減至2015年的3家,但目前正重新在當(dāng)?shù)卦鼋?家工廠,是1983年以來首次,這是為了滿足中國及其他地區(qū)的強勁需求及日本銷售復(fù)蘇。責(zé)任編輯:余鵬飛 \n"; Result word = ToAnalysis.parse(str);//分詞結(jié)果的一個封裝,主要是一個List<Term>的terms System.out.println(word.getTerms()); List<Term> terms = word.getTerms(); //拿到terms System.out.println(terms.size()); for(int i=0; i<terms.size(); i++) { String term = terms.get(i).getName(); //拿到詞 String natureStr = terms.get(i).getNatureStr(); //拿到詞性 System.out.println(term + ":" + terms.get(i).getSynonyms()); } } }
打包成 hlta.jar
python 調(diào)用代碼
import jpype from jpype import * import os # 獲取jvm路徑 jvmPath = jpype.getDefaultJVMPath() # jvmPath = "D:/Java/jre1.8.0_151/bin/server/jvm.dll" #動態(tài)加載jar包 libPath = "hlta" lib_jar=['HLTA.jar', 'HLTA-deps.jar'] lib_jar = [ os.path.join(libPath,x) for x in lib_jar] jvmArg = "-Djava.class.path="+";".join(lib_jar) print(jvmArg) #啟動jvm if not jpype.isJVMStarted(): jpype.startJVM(jvmPath, jvmArg) #python 執(zhí)行java代碼 jpype.java.lang.System.out.println("helloworld!") #獲取java類。這個是以jar包中的相對路徑來找到 JDClass = jpype.JClass("jt") #這里的有網(wǎng)上說是jd = JDClass()。問題來了,加上括號,在執(zhí)行函數(shù)時可能會失敗 jd = JDClass jd.run() print( jd.formatDuring(555555) ) # main函數(shù)的參數(shù)是一個list jd.main(['a'])
到此這篇關(guān)于Python實現(xiàn)調(diào)用jar或執(zhí)行java代碼的方法詳解的文章就介紹到這了,更多相關(guān)Python調(diào)用jar內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在tensorflow中設(shè)置使用某一塊GPU、多GPU、CPU的操作
今天小編就為大家分享一篇在tensorflow中設(shè)置使用某一塊GPU、多GPU、CPU的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python如何向SQLServer存儲二進(jìn)制圖片
這篇文章主要介紹了Python如何向SQLServer存儲二進(jìn)制圖片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Pytorch BCELoss和BCEWithLogitsLoss的使用
這篇文章主要介紹了Pytorch BCELoss和BCEWithLogitsLoss的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05pytorch實現(xiàn)查看當(dāng)前學(xué)習(xí)率
這篇文章主要介紹了pytorch實現(xiàn)查看當(dāng)前學(xué)習(xí)率,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06