python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python调用jar

Python实现调用jar或执行java代码的方法详解

作者:Brickie-liu

这篇文章主要介绍了Python实现调用jar或执行java代码的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

简介

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'])

到此这篇关于Python实现调用jar或执行java代码的方法详解的文章就介绍到这了,更多相关Python调用jar内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文