jpype的使用

目录

1、安装

(1)如何确认自己java是多少位的?

(2)如何确认自己python是多少位的?

(3)安装 jpype

2、使用

(1)小试牛刀

(2)调用jar包方法

问题1:shutdownJVM停止后restart失败的情况 

问题2:只能调用静态方法

问题3:调用其他包方法

(3) 调用jar包main方法

 问题1:怎么处理入参是中文

问题2:java命令行方式运行jar包

1、安装

注意点:python和java的位数一定要一致

(1)如何确认自己java是多少位的?

(2)如何确认自己python是多少位的?

(3)安装 jpype

第一种:pip install jpype1

我反正一直失败

 降级指定版本下载都不行:但是我39版本的python是可以pip安装成功的 

第二种:下载whl包安装

下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

 python37 -m pip install JPype1-1.1.2-cp37-cp37m-win32.whl

2、使用

(1)小试牛刀

import os
import jpype


jvmPath = jpype.getDefaultJVMPath()
jpype.startJVM(jvmPath)
jpype.java.lang.System.out.println("hello world!")
jpype.shutdownJVM()

 注意点:JAVA_HOME一定要配置对,要不会找不到

jpype.getDefaultJVMPath()  #这里说明了其实我们不用装JDK只要安装和python位数一致的JRE就行了

这个也是可以配置的:默认的是使用的JDK中自带的jre,我们可以只安装jre的情况下指定这个路径

 

(2)调用jar包方法

怎么打jar这里就不赘述了:

import os
import jpype


def java_class_func(jar_path, class_name, func_name, jvm_path=None, *args):
    """
    调用jar包中class下的方法
    :return:
    """
    # jar包路径的配置
    # jarpath = os.path.join(os.path.abspath("."), "D:\\hf-0.1.jar")
    jarpath = os.path.join(os.path.abspath(".."), jar_path)
    # 这里指定了jvm
    if jvm_path:
        jvmpath = jvm_path
    else:
        jvmpath = jpype.getDefaultJVMPath()
    jpype.startJVM(jvmpath, "-ea", "-Djava.class.path=%s" % jarpath)

    # 这里是指定哪个class,执行哪个方法,入参和结果展示
    # java_class = jpype.JClass("com.dubbo.testjsf.R2mUtils")
    # java_class.getCustKeys()
    
    java_class = jpype.JClass(class_name)
    ru_param = ','.join(list(map(lambda x: json.dumps(x), args)))

    ########################################################################
    # 判断是否有中文在里面,有就转成unicode,后来发现是pycharm的编码格式问题,这里就注释了
    # def _iszh(p):
    #     for c in p:
    #         if '\u4e00' <= c <= '\u9fa5':
    #             return True
    #     return False
    #
    # args_list = list(map(lambda x: json.dumps(x) if _iszh(x) else x, args))
    ########################################################################

    res = eval("java_class.%s(%s)" % (func_name, ru_param))
    print(res)  # 打印有返回值方法的结果
    jpype.shutdownJVM()


if __name__ == '__main__':
    java_class_func(r"D:\mycode\javacode\jsf_hf_demo\hf\target\hf-0.2.jar",
                    "com.dubbo.testjpype.Jpype",
                    "func1",
                    "C:\\Java\\jre\\bin\\client\\jvm.dll")
    java_class_func(r"D:\mycode\javacode\jsf_hf_demo\hf\target\hf-0.2.jar",
                    "com.dubbo.testjpype.Jpype",
                    "func4",
                    "C:\\Java\\jre\\bin\\client\\jvm.dll",
                    "第一个参数",
                    "第二个参数")

    java_class_func(r"D:\mycode\javacode\jsf_hf_demo\hf\target\hf-0.2.jar",
                    "com.dubbo.testjpype.Jpype",
                    "func2",
                    None,
                    "第一个参数")

    java_class_func(r"D:\mycode\javacode\jsf_hf_demo\hf\target\hf-0.2.jar",
                    "com.dubbo.testjpype.Jpype",
                    "func3",
                    None,
                    "1",
                    3)

问题1:shutdownJVM停止后restart失败的情况 

解决:可以遍历需要调用的类、方法、入参,做个结构体设计,就可以调用多个方法的情况

 

# -*- coding:utf-8 -*-
import json
import os

import jpype

def java_class_func1(jar_path, actions, jvm_path=None):
    """
    调用jar包中class下的方法
    :return:
    """
    jarpath = os.path.join(os.path.abspath(".."), jar_path)
    # 这里指定了jvm
    if jvm_path:
        jvmpath = jvm_path
    else:
        jvmpath = jpype.getDefaultJVMPath()
    jpype.startJVM(jvmpath, "-ea", "-Djava.class.path=%s" % jarpath)

    for class_name, func_name, in_params in actions:
        java_class = jpype.JClass(class_name)
        ru_param = ','.join(list(map(lambda x: json.dumps(x), in_params)))
        res = eval("java_class.%s(%s)" % (func_name, ru_param))
        print(res)  # 打印有返回值方法的结果
    jpype.shutdownJVM()


if __name__ == '__main__':
    java_class_func1(r"D:\mycode\javacode\jsf_hf_demo\hf\target\hf-0.2.jar",
                     [
                         ["com.dubbo.testjpype.Jpype", "func1", []],
                         ["com.dubbo.testjpype.Jpype", "func2", ["第一个参数"]]
                     ]
                     )

问题2:只能调用静态方法

解决:用静态方法调用类方法 

问题3:调用其他包方法

if __name__ == '__main__':
    java_class_func1(r"D:\mycode\javacode\jsf_hf_demo\hf\target\hf-0.2.jar",
                     [
                         ["com.dubbo.testjsf.JpypeThree", "func1", []],
                         ["com.dubbo.testjpype.JpypeOther", "func1", []],
                         ["com.dubbo.testjpype.Jpype", "func1", []],
                         ["com.dubbo.testjpype.Jpype", "func2", ["第一个参数"]],
                         ["com.dubbo.testjpype.Jpype", "func3", ["1", 3]],
                         ["com.dubbo.testjpype.Jpype", "func4", ["第一个参数", "第二个参数"]],
                         ["com.dubbo.testjpype.Jpype", "func5", []],
                         ["com.dubbo.testjpype.Jpype", "func0", []]
                     ]
                     )

(3) 调用jar包main方法

# -*- coding:utf-8 -*-
import json
import os

import jpype

def java_class_main(jar_path, class_name, main_args, jvm_path=None):
    """
    调用jar包中class下的main方法
    :return:
    """
    jarpath = os.path.join(os.path.abspath(".."), jar_path)
    if jvm_path:
        jvmpath = jvm_path
    else:
        jvmpath = jpype.getDefaultJVMPath()
    jpype.startJVM(jvmpath, "-ea", "-Djava.class.path=%s" % jarpath)
    # 使用JClass调用main方法
    # jpype.JClass(class_name).main(main_args)
    # 使用JPackage调用main方法
    # jpype.JPackage("com").dubbo.testlala.Jpype.main(main_agrs)
    v1, v2 = class_name.split(".", 1)
    eval('jpype.JPackage("%s").%s.main(%s)' % (v1, v2, main_args))
    jpype.shutdownJVM()

if __name__ == '__main__':
        java_class_main(r"D:\mycode\javacode\jsf_hf_demo\hf\target\hf-0.2.jar",
                    "com.dubbo.testjpype.Jpype",
                    '["第一个参数","第二个参数","第三个参数"]')

 问题1:怎么处理入参是中文

在cmd下运行是正确的,是本机pycharm中终端编码格式问题

 查看cmd下的编码格式

 pycharm中修改编码格式

问题2:java命令行方式运行jar包

# 指定jar中调用那个class的main函数(java -cp jar的路径 class路径)

java -cp .\hf\target\hf-0.1.jar com.dubbo.testjsf.Get22

#jar中调用MANIFEST.MF配置的入口class的main函数

java -jar .\hf\target\hf-0.1.jar

#main方法有入参的情况(java -cp jar包路径 class路径  main的入参多个就空格分开)

java -cp .\hf\target\hf-0.1.jar com.dubbo.testjsf.Get22 "15910843034" "143121321"

java -cp .\hf\target\hf-0.1.jar com.dubbo.testjsf.Get22 asktest dsf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值