(转载)Python 的 JPype 模块调用 Jar 包

Python 的 JPype 模块调用 Jar 包

背景与需求

  1. 最近学习并安装使用了HttpRunner框架去尝试作接口测试,并有后续在公司推广的打算。
  2. HttpRunner由Python开发,调用接口时须要依赖Python;而大多数公司的扩展工具包使用Java编写,测试同窗使用Python从新实现不显示。
  3. 目前网上的资料均停留在对单个JAR包的引用于使用上,对于使用多个有依赖关系的JAR包的方法并未说起。

JPype介绍

1. JPype是什么:

JPype是一个可以让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足。
JPype的实际运行环境仍然是python runtime,只是在运行期间启动了一个嵌入的jvm。html

2. 环境搭建

个人开发环境是: Windows7_64bit + Python3.5_64bit + JDK1.8_64bit + +Jpype_0.5.52 (Python和JDK的位数必定要相同)java

  1. 安装JPype: pip3.5 install JPype1-py3
  2. 找到JRE中的 jvm.dll文件 (在JDK中的路径相似以下路径: F:/Java/jdk1.8.0_45/jre/bin/server/jvm.dll)

3. JPype使用说明

1. 启动JVM

JPype 提供的 startJVM() 函数的做用是启动 JAVA 虚拟机,因此在后续的任何 JAVA 代码被调用前,必须先调用此方法启动 JAVA 虚拟机。
jpype.startJVM() 的定义:
startJVM(jvm, *args)python

3. 引用第三方JAVA扩展包

不少时候,在 python 项目中须要调用第三方的 Java 扩展包,这也是 JPype 的一个重要用途。
经过在 JVM 启动参数增长:-Djava.class.path = ext_classpath,实如今 Python 代码中调用已有的 Java 扩展包。
经过在 JVM 启动参数增长: -Djava.ext.dirs = ext_dirs , 实如今Python 代码中引入 Java 扩展包的其余依赖包。mysql

注意事项
当有其余依赖JAR包时,必定要使用-Djava.ext.dirs = ext_dirs进行引入,不然在调用类对象时会报错:
jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class not foundgit

2. 关闭JVM

当使用完 JVM 后,能够经过 jpype.shutdownJVM() 来关闭 JVM,该函数没有输入参数。当 python 程序退出时,JVM 会自动关闭。sql

4. 实践

1. 直接调用JAVA API

from jpype import * import os.path startJVM("F:/Java/jdk1.8.0_45/jre/bin/server/jvm.dll", "-ea") java.lang.System.out.println("hello World") shutdownJVM() 

2. 调用JAVA第三方扩展包

JAR包源代码为:apache

package com.test; import org.apache.log4j.Logger; public class MathDemo { public static Logger logger = Logger.getLogger(MathDemo.class.getName()); public int add(int a, int b) { return a+b; } } 

将此源码打包编译为:MathDemo.jar,而MathDemo.jar又依赖log4j-1.2.16.jar。编程

Python脚本代码为:小程序

from jpype import * import jpype jarpath = os.path.join(os.path.abspath('.'), 'F:/JPypeTestl/MathDemo.jar') dependency = os.path.join(os.path.abspath('.'), 'F:/JPypeTestl/dependency') jpype.startJVM("F:/Java/jdk1.8.0_45/jre/bin/server/jvm.dll", "-ea", "-Djava.class.path=%s" %jarpath,"-Djava.ext.dirs=%s" %dependency) #当有依赖的JAR包存在时,必定要使用-Djava.ext.dirs参数进行引入 JClass = jpype.JClass('com.test.MathDemo') instance = JClass() result = (instance.add(10, 20) print (result) jpype.shutdownJVM() 

5. 注意事项

在启动JVM的时候,默认不会把JDK中 “\jre\lib\ext” 扩展包下的JAR包引入,因此为了不调用过程当中出现问题,建议将 “\jre\lib\ext” 内的JAR, 均放入咱们本身的 "dependency" 目录,自行导入。
我在工做中就遇到过使用JAVA调用JAR成功,可是使用JPypy调用JAR,缺少ext扩展目录中JAR包的状况。微信小程序

分类: python
0
0
« 上一篇: mysql_config not found和error: command 'gcc' failed with exit status 1
» 下一篇: Appium 测试微信小程序 Webview
posted @ 2018-03-21 11:08 江诗 阅读( 750) 评论( 0) 编辑 收藏
相关文章
相关标签/搜索