Python实现调用jar或执行java代码的方法详解
Brickie-liu 人气:0简介
Python 作为一种灵活的软件开发语言在当今被广泛使用。在软件开发过程中,有时需要在 Python 项目中利用既有的 Java 代码,已达到节省时间和开发成本的目的。因此,找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的。 JPype 就是这样的一个工具,利用它可以使 Python 程序方便的调用 Java 代码。
JPype使Python可以完全访问Java类库。Jython/JPython重新实现了Python,JPype则提供了两个虚拟机的接口。JPype可以在JSP,Servlet、RMI服务器和IDE插件都方面用Python代替Java。
缺陷:
package之外的类(在<default>中)不能被导入。
不能重启JVM。
不能处理依赖当前类的方法。
安装jpype
pip install jpype1 conda install -c conda-forge jpype1
注意这两个不能通用。如果使用pip安装,在conda调用会出现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 = " 原标题:港媒:“日本制造”带动日本制造 中国厂商赴日设立生产线 参考消息网9月3日报道 港媒称,日本制造的产品一直以来受大众追捧,近年,越来越多的中国工厂到日本设立生产线。截至今年3月,在日本设厂的中国内地及香港厂商已达49家,是5年前的一倍。 香港《经济日报》网站8月30日援引美国《华尔街日报》报道称,一家专门生产牙刷的上海企业于大坂设厂,并把产品销售至内地。该公司执行总监Wang Lin指出,中国人生活水平提升,消费者追求更好的产品,而内地人一向对日本产品印象良好。该公司以前于内地生产其他廉价牙刷品牌,但之后认为能向中国消费者出售较高级的产品,故萌生于日本设厂的念头。 报道称,该公司目前每月出口5万套牙刷到中国,每支售价为5美元,产品包装上印有日文,并贴有中文翻译。他认为,在日本设厂的成本虽然较高,但产品会是货真价实的日本货。 此外,也有日本企业回流当地设厂。 报道称,日本化妆品企业资生堂早年因日本国内销售下降,以致公司减低产能,由2004年6家日本工厂减至2015年的3家,但目前正重新在当地增建2家工厂,是1983年以来首次,这是为了满足中国及其他地区的强劲需求及日本销售复苏。责任编辑:余鹏飞 \n"; Result word = ToAnalysis.parse(str);//分词结果的一个封装,主要是一个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 调用代码
import jpype from jpype import * import os # 获取jvm路径 jvmPath = jpype.getDefaultJVMPath() # jvmPath = "D:/Java/jre1.8.0_151/bin/server/jvm.dll" #动态加载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 执行java代码 jpype.java.lang.System.out.println("helloworld!") #获取java类。这个是以jar包中的相对路径来找到 JDClass = jpype.JClass("jt") #这里的有网上说是jd = JDClass()。问题来了,加上括号,在执行函数时可能会失败 jd = JDClass jd.run() print( jd.formatDuring(555555) ) # main函数的参数是一个list jd.main(['a'])
加载全部内容