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

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

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

Brickie-liu   2022-12-24 我要评论

简介

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

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们