目录
问题1:shutdownJVM停止后restart失败的情况
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