JPype1使用总结
- 目的:
使用Locust+Python压测账号资料接口,使用JPype调用java代码,缩短压测脚本编写 - 前提条件:
进行性能压测过程中,需要压测账号相关接口,由于账号相关接口设计到加密解密,用Python重新编写加解密方式过于繁重,介于后台已开发完账号系统加解密方法,顾产生使用JPype1(用JPype1调用Java类里面的方法) - 环境:
系统:Centos
Python版本:2.7.3 - 步骤
- 安装JPype1
pip install JPype1报如下错误:
原因解析:缺失gcc相关配置,以及python库
解决方式:
Python 2.7
$ sudo yum -y install gcc gcc-c++ kernel-devel
$ sudo yum -y install python-devel libxslt-devel libffi-devel openssl-devel
$ pip install JPype1
Python 3
$ sudo apt-get install python3-dev
$ pip install JPype1 - 安装java 1.6.0_41
- 以前有安装过java,版本且版本不对,先删除已安装的版本:
使用rpm -qa | grep jdk,可以找到已经安装的jdk:
java-1.8.0-openjdk-headless-1.8.0.191.b12-0.el7_5.x86_64
java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64
copy-jdk-configs-3.3-10.el7_5.noarch
依次删除上面已安装的文件
命令:yum -y remove + jdk名
例:yum -y remove java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64 - 安装java 1.6.0_41使用下面命令可以查找yum库中有哪些版本的jdk
yum search java | grep jdk
选择java-1.6.0-openjdk.x86_64进行安装
yum install java-1.6.0-openjdk.x86_64
默认的安装目录为:
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64
设置环境变量:
vim /etc/profile
在profile文件中添加如下内容
#set java environment
JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
更新修改:
source /etc/profile
命令行输入java会出现提示则说明安装成功 - 将需要调用的jar包和依赖jar包放在程序的同一目录
- 以前有安装过java,版本且版本不对,先删除已安装的版本:
- 安装JPype1
- 使用JPype:(此处遇到的问题比较多)
- 使用jvmPath=jpype.getDefaultJVMPath(),无法获取到JVM.dll文件,改问题在centos中不会出现

解决方式:
在安装的Java路径下找到jvm.dll,我本机安装的jvm路径是:C:/Program Files/Java/jdk1.6.0_45/jre/bin/server/jvm.dll
windows下替换jpype.getDefaultJVMPath()自动获取即:
jvmPath = "C:/Program Files/Java/jdk1.6.0_45/jre/bin/server/jvm.dll" - Python奔溃问题:

逻辑:
(1)本次涉及到依据方法1返回的盐等信息,
(2)再使用JPype调用java的加密方法
(3)再赋予方法2的请求体值
原因解析:从上图中框出来的代码可以看出,是在JPype调用shutdownJVM()后,调用打印函数,答应了shoutdownJVM()前的signMandA变量
解决方式:将逻辑1返回回来的数据,通过逻辑2去调用,再将上面的逻辑3放入到逻辑2内,目的在于避免shoutdownJVM()后原逻辑2返回的数据被释放 - 找不到jar包中的class

原因分析如下:
(1)打包jar包时,java版本不统一,导致数据解析时出现问题
(2)python与JDK位数不一致,64/32,打包前确认使用哪个位数的
(3)打包的jar包内类内的函数使用了static方法、private修饰符,导致调用失败
解决方式:统一打包和使用环境jdk版本和位数,统一python和jdk位数 - 压测时JVM只正常执行一次里面的内容

原因分析:上图中打印了JVM is already started,说明在压测的时候重复去打开Jave的JVM虚拟机,导致不执行
解决方式:打开JVM前,判断JVM状态是否为打开,配上判断JVM状态代码:if not jpype.isJVMStarted():
jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=%s" % jarpath)
- 使用jvmPath=jpype.getDefaultJVMPath(),无法获取到JVM.dll文件,改问题在centos中不会出现
JPype1使用总结的更多相关文章
- python3.6安装jpype1后引入jpype报“ImportError: numpy.core.multiarray failed to import”问题
jpype是调用java接口的第三方库,通过该库,python可以运行java程序,从而解决一些调用java的问题,比如:java开发的接口,测试时, 有java的加密算法就不用python写一遍重复 ...
- python的java胶水(jpype1)
1.直接使用pip安装jpype1 命令 pip install jpype1 但是,很不幸,提示报错,缺少VC++组件. 2.使用其他方法安装 在 https://www.lfd.uci.edu/ ...
- Python 3.5安装JPype
使用命令pip install jpype1可安装jpype. 如果出现如下情况: creating build\lib.win-amd64-3.5\jpypex copying jpypex\__i ...
- selenium自动化过程中如何操作Flash动画
最近在看python的爬虫框架(scrapy),一个词概括就是:"酸爽"!等把selenium自动化版块讲完后,打算写一写关于scrapy相关的知识,打算从源码角度解析下scrap ...
- 使用Python查询JMX
一.介绍 我们知道 java 项目中的 JMX 接口信息是十分有用的,我们可以提取这些信息来分析或告警.但是 JMX 的 API 只在 java 中实现,因此,找到一个 Python 代码调用 Jav ...
- 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析
这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...
- 使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务
由于采集省市区镇数据需要对地名进行拼音转换,由于第三方高准确度接口对IP进行了限制,处理大量数据变得异常缓慢. 使用了一个折中的办法,省市区 3级(3千+)用高准确度接口(几乎没有拼错的地名),镇级( ...
- python2.7 (x64) 调用 java 代码实践
背景:公司实施接口自动化测试,使用的框架python+unittest:因为开发使用的架构师SpringBoot,在测试过程中难免需要使用到python调用JAVA的一些接口,所以需要用到python ...
- Python的JAVA胶水——jpype
Python的JAVA胶水--jpype python可以作为一门胶水语言使用,可以用其它语言的优势来弥补自身如性能方面的不足,jpype就是在Python中使用jvm的第三方库 文档在这里 安装 s ...
随机推荐
- 『高性能模型』HetConv: HeterogeneousKernel-BasedConvolutionsforDeepCNNs
论文地址:HetConv 一.现有网络加速技术 1.卷积加速技术 作者对已有的新型卷积划分如下:标准卷积.Depthwise 卷积.Pointwise 卷积.群卷积(相关介绍见『高性能模型』深度可分离 ...
- gulp打开gbk编码的html文件乱码
先上图,好忧伤:
- 教你函数如何传参更加方便 ----python 传参 *args **kwargs
*args 和 **kwargs 可以将不定数量的参数传递给函数 *args 和 **kwargs,前者适用于 传入非键值对的可变数量的参数列表,后者适用于 传入不定长度的键值对, 作为参数传递给函 ...
- 《BUG创造队》第二次团队作业:团队项目选题报告
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验六 团队作业2:团队项目选题 团队名称 BUG创造队 作业学习目标 可行性自评总结,并且采用NABCD方法进行项目初步分 ...
- yii依赖注入和依赖注入容器
依赖注入和依赖注入容器¶ 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Ser ...
- Ajax如何实现从前端不刷新页面就可以到后端取到数据
提到axaj很多人总说很难,什么回调函数呀等等就让人心烦,其实懂得ajax在js里面是如何实现向服务器请求数据的原理,那么理解ajax也就不是很难了,现在我们一起来看看. ajax作用:ajax技术的 ...
- Python_Mix*函数名的使用以及第一类对象,闭包,迭代器,for循环的内部机制
一:函数名的应用(第一类对象) 函数名的命名规范和变量是一样的,函数名其实就是变量名, 0)函数名可以赋值给其他变量 def func(): #定义一个名为func的函数 print('my ange ...
- POJ - 2777——Count Color(懒标记线段树二进制)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53639 Accepted: 16153 Des ...
- swiper使用中一些点的总结
最近做了PC端改版,要求移动端有更好的体验,一些产品滚屏的展示,就用了swiper插件,以方便用户在移动端访问可以滑动翻屏展示. 本次项目中使用的是swiper2.0版本. 首先要引入swiper的j ...
- Django基础-01
Django 是基于 Python,所有的 Django 代码都是用Python写成的. Django 特点 强大的数据库功能 拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生 ...