背景与需求

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

JPype介绍

1. JPype是什么:

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

2. 环境搭建

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

  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)

3. 引用第三方JAVA扩展包

很多时候,在 python 项目中需要调用第三方的 Java 扩展包,这也是 JPype 的一个重要用途。
通过在 JVM 启动参数增加:-Djava.class.path = ext_classpath,实现在 Python 代码中调用已有的 Java 扩展包。
通过在 JVM 启动参数增加: -Djava.ext.dirs = ext_dirs , 实现在Python 代码中引入 Java 扩展包的其他依赖包。

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

2. 关闭JVM

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

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包源代码为:

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 的 JPype 模块调用 Jar 包的更多相关文章

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

    Python 的 JPype 模块调用 Jar 包 背景与需求 最近学习并安装使用了HttpRunner框架去尝试做接口测试,并有后续在公司推广的打算. HttpRunner由Python开发,调用接 ...

  2. Python调用jar包中的方法

    [本文出自天外归云的博客园] 需求 最近在后台项目代码中一段自定义的AES加解密的程序在平时的测试工作中应用频繁.因为写脚本经常会需要使用,而经过各种尝试,比如jpype等,都不尽如人意.最后转换思路 ...

  3. python实战===用python调用jar包(原创)

    一个困扰我很久的问题,今天终于解决了.用python调用jar包 很简单,但是网上的人就是乱转载.自己试都不试就转载,让我走了很多弯路 背景:python3.6 32位   + jre 32位  +  ...

  4. 安卓环境下,通过QT调用jar包

    在安卓上,许多第三方工具都提供jar包.qt可以通过jni来调用jar包.本文通过一个例子,说明安卓上QT调用jar的方式. 工具/原料   qt android jar包 jar包准备   1 ja ...

  5. Unity调用Android的两个方式:其一、调用jar包

    unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...

  6. Loadrunner11.0调用Jar包

    又好几天不写东西了,是不是意味着最近没有大的进步,时时敲打自己. 今天把loadrunner如何调用Jar包搞定了,现在把配置的过程中需要注意的东西写下来,分享给小伙伴儿,减少他们在前行路上的弯路. ...

  7. html实现调用jar包

    整体思路:html引用URL protocol-本地注册表key,key对应某一c#写的exe可执行文件,由exe可执行文件调用cmd,cmd执行jar包. 1.添加注册表: Windows Regi ...

  8. winform调用jar包

    因为工作需要,需要做一个数据上传的程序,客户规定的是:数据接口采用http连接,采用JSON-RPC轻量级远程调用协议.所以决定用winform做一个管理界面(其中还包括其他的功能),java完成数据 ...

  9. 如何制作Jar包并在android中调用jar包

    android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...

随机推荐

  1. 与scrollTop相关的一些方法(更新)

    刷新页面回到页面顶部 $(document).ready(function () { $(window).scrollTop(0); } 滑动到页面指定位置执行某项操作 $(document).rea ...

  2. foreach 中获取索引index的方法

    一样,很少用到,记下来先 主要代码: foreach (var item in arr) { int index = arr.indexOf(item); //index 为索引值 }

  3. JSSDK调用微信原生的功能上传图片保存到自己的服务器中

    第一件事首先是微信的选择图片功能,就是微信发朋友圈选择图片的时候那个界面 //调用微信拍照功能 wx.chooseImage({ count: 1, // 默认9 sizeType: ['origin ...

  4. JavaScript - proxy

    Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等). 来看看常用的方法 handler.get() let o = { name: 'liwenchi', age: 1 ...

  5. 题解:[JSOI2004]平衡点 / 吊打XXX

    这个题目算是一个模拟退火的板子题 物重一定,绳子越短,重物越低,势能越小,势能又与物重成正比 使得$\sum_{i=1}^nd[i]*w[i]$也就是总的重力势能最小,可以使得系统平衡 交了两面半.. ...

  6. LOJ子序列

    题目描述 https://loj.ac/problem/6074 题解 对于子序列的dp,我们可以设置一个dp. 我们设dp[i]表示以i这个字符结尾的子序列个数,转移为dp[i]+=∑dp[k]-d ...

  7. 说说PC站和移动站的移动适配关系优化

    曾经写过关于手机网站的SEO优化方向,但是多数是注重在移动网站代码方面,而把移动和PC的重点关系优化给忽略了,这方面也是很多做SEO优化站长给忽略的一些事情. 2015年11月6日,在百度站长平台可以 ...

  8. vue(初探预渲染)

    ---恢复内容开始--- 一.前言 1.简介预渲染                     2.案例演示(不配置预渲染)                     3.配置预渲染, 二.主要内容 1.简 ...

  9. js下拉框:从数组中筛选出匹配的数据

    handleChange(val) { let obj = {} // 遍历数组 obj = this.options.find(item => { // 筛选出匹配的数据 return ite ...

  10. Open vSwitch系列之二 安装指定版本ovs

    在ovs学习过程中,如果自己想要安装一个ovs交换机其实一条简单的命令 apt  install openvswitch 就可以了,但是这种方法只能安装低版本的ovs.在特殊情况下需要安装指定版本,例 ...