起因:本人不会Java代码,但是想在jmeter(纯Java语言)中去调用python脚本,来达到我的目的。于是开启了一个漫长的新知识探索。过程崎岖,在小巷子里绕了好久。均告失败!!!!

一、开始各种百度找思路,最终大概流程就是这个样子的(以下所有操作均在window下进行)。

  1、下载所需文件(包含JDK、Java编辑器、Python编辑器、Python3.6、jython-standalone-2.7.1.jar);

  2、安装并配置JDK环境变量(本人所用为版本为:JDK 64位 1.8.0_211);

  3、安装并配置Python环境(本人所用为:Python3.6、2.7版);

  4、安装Java编辑器(本人所用为:Eclipse);

  5、安装Python编辑器(本人所用为:PyCharm);

  6、配置jython环境变量;

  7、编写Python测试脚本;

  8、新建Java项目;

  9、Java项目加载jython-standalone-2.7.1.jar包;

  10、编写Java测试脚本;

  11、调试;

二、接下来就让我们一起来踩坑、填坑吧,吼吼吼~

  1、下载所需文件,其中JDK、jython-standalone-2.7.1.jar、Eclipse、PyCharm 已提供下载地址:

  链接:https://pan.baidu.com/s/1TQvm0uxxYFXa_ICck86-hg
  提取码:812d

  2、配置JDK环境变量(自行百度解决)

  3、安装并配置Python环境

    1)、下载Python;去官网—>   https://www.python.org/downloads/release/python-374/

    2)、安装并配置环境;去这里—>   https://jingyan.baidu.com/article/c45ad29c05c208051653e270.html

  4、安装Java编辑器Eclipse

    1)、将下载好的压缩包进行解压 (免安装),点击 eclipse.exe文件启动编辑器即可;

  5、安装Python编辑器;(自行百度解决)

  6、配置jython环境变量;

    1)、作用:Jython的主要通途就是在Java中调用Python程序;而且,还可以直接在Jython程序中引用Java。就是一座桥,连接他和它。

    2)、配置:其实是有两个不同的文件

           jython_installer-2.5.2.jar:需要安装和配置环境变量的,多用于使用Java的Runtime()函数调用时。

        jython-standalone-2.7.1.jar:免安装,需要配置环境变量,通过Jython的API进行调用。能够指定到具体的函数和方法。

      本人采用的是第二种。配置环境变量,即将 jython-standalone-2.7.1.jar 所在的目录(D:\java_test\lib\jython-standalone-2.7.1.jar)添加到系统环境变量的CLASSPATH中。

     (没有这一步会报错:java.io.IOException: Cannot run program "python": CreateProcess error=2, 系统找不到指定的文件。)

  7、编写Python测试脚本,如下:

a = [1,2,3,4,5,6,7]
b = a[:]
print(b)

  8、新建Java项目

    1)、新建一个项目文件夹 java_test,在文件件中新建一个lib文件夹,将jython-standalone-2.7.1.jar复制到lib文件中;

    2)、打开Eclipse,依次新建Java项目、填写项目名称。(Contents中选择Create project from existing source ,位置选择java_test文件夹),保存;

    3)、选择项目下的src文件后右键新建包,填写包名称,保存;

    4)、选择新建的包右键新建类,填写类名称,保存;

  9、Java项目加载jython-standalone-2.7.1.jar包

    1)、选择新建的Java项目,右键后依次选择 “构建路径---->配置构建路径---->L库---->添加JAR--->找到lib文件夹中的jython-standalone-2.7.1.jar文件;

    2)、在java_test文件夹中新建一个放Python脚本的文件Script文件夹;

    此时可以看到的文件目录结构如下:

   

     其中bin、src文件夹、.classpath、.project是在创建Java项目时自动创建,bin是用来存放Java项目目录、src存放类目录,lib文件夹是手动添加的存放需要导入的jar文件目录,Script文件夹是手动添加的存放需要用的Python文件目录;

  10、编写Java测试脚本

    1)、在Java中简单调用Python程序,不需要传递参数,也不需要获取返回值,简单版的先测试一下有没有问题;

    Java测试代码如下:

package java_Test;import java.io.IOException;
import org.python.util.PythonInterpreter;public class TestIng {/*** @param args* @throws IOException * @throws InterruptedException */public static void main(String[] args) throws IOException {// 写入jython文件的路径System.setProperty("python.home","D:\\java_test\\lib\\jython-standalone-2.7.1.jar");// 写入Python文件的路径String python = "D:\\java_test\\Script\\test.py";PythonInterpreter interp = new PythonInterpreter();interp.execfile(python);interp.cleanup();interp.close();}
}

简单测试了一下结果如下:

  结果可以正常打印出来 ,但是报了错,console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0.  其实这是编码的问题 。

  解决办法:解决办法为在要执行的代码上右键,Run As>Run Configurations,选择第二个页签Arguments,在VM arguments中添加

  -Dpython.console.encoding=UTF-8

  

  在运行就不会有那个红的报错了 ,欧耶~~~

  2)、以上完成算是将Java与Python文件打通了 ,但是这并不能满足我的使用要求,因为我是需要有参数传入和输出的。于是乎,在Java中单向调用Python程序中的方法,需要传递参数,并接收返回值。Python既支持面向函数式编程,也支持面向对象编程。因此,调用Python程序中的方法也分别以面向函数式编程和面向对象式编程进行说明。

  开始第二步的征程;

    修改Python文件内容(调用方法),如下:

#coding=utf-8
import mathdef power(x,y):return math.pow(x,y)

对应的Java代码如下:

package java_Test;import java.io.IOException;
import org.python.core.Py;
import org.python.core.PyFunction;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;public class TestIng {/*** @param args* @throws IOException * @throws InterruptedException */public static void main(String[] args) throws IOException {System.setProperty("python.home", "D:\\java_test\\lib\\jython-standalone-2.7.1.jar");// 1. Python面向函数式编程: 在Java中调用Python函数String pythonFunc = "D:\\java_test\\Script\\test.py";PythonInterpreter pi1 = new PythonInterpreter();// 加载python程序
        pi1.execfile(pythonFunc);// 调用Python程序中的函数PyFunction pyf = (PyFunction) pi1.get("power", PyFunction.class);PyObject dddRes = pyf.__call__(Py.newInteger(2), Py.newInteger(3));System.out.println(dddRes);pi1.cleanup();pi1.close();}
}

  第一个错误出现了,

 

  原因:说文件的编码不合规,有问题 ,因为这个是直接修改后缀名来改变文件格式的所以相当于是假修改 。

  解决办法:将文件另存为,在另存为的时候选择文件的编码为UTF-8。就可以解决了

  此时此刻,第二个错出来了 。

  

  如果你遇到这个问题,那么恭喜你。和我同喜了,哈哈 ~~

  然后如果你去百度,貌似是解决不了的(是真的没有相关详细的解决办法说明),那我就来悄悄地告诉你是为啥子吧!!!

  原因:是jython的版本问题 ,版本太高了 ,他不支持这样让你玩,换个低版本的,我选jython-standalone-2.5.3.jar,于是我也把它上传云盘了

  详细解决办法:

    1)、解除之前导入的jython-standalone-2.7.1.jar版本的包,解除办法就是将导入的办法倒序操作就行;

    2)、删除java_test文件夹中所有的文件,按照之前创建的文件目录接口重新文件夹结构;

    3)、将jython-standalone-2.5.3.jar文件配置系统环境变量;

    4)、重新新建Java项目;

  期间还有其他的小问题,如:

原因:代码的编写问题,Python代码中一个逗号是中文版的

解决办法:改成英文版的就OK了

   上边贴的代码此时也是会报错的,如jar路径名称、代码语法等。对应的修改一下就OK了 。

三、以上是完成了第一阶段的调试,接下来为我自己所需来就行调试。

 Python代码如下(Python文件名为:Original.py):

# -*- coding: utf-8 -*-
import base64
import ast
import urllib.parsedef addse(Original):
    # 解码url_org = urllib.parse.unquote(Original)# 提取 args参数parameter1 = urllib.parse.urlparse(url_org)parameter2 = urllib.parse.urlparse(parameter1.fragment)# base64位解码args参数并切片截取值parameter3 = base64.b64decode(parameter2.query[5:])# 将截取的byte类型的值转化为字符串str类型的值# print(parameter3)  会输出被b包围的字典, b 表示 byte的意思,我们只要再将byte转换回去# 将str类型的值转化为字典类型parameter5 = ast.literal_eval(str(parameter3,'utf-8'))# 通过for循环将字典中的值取出for i in parameter5:return("%s = %s" %(i,parameter5[i]))if __name__ == "__main__":addse(Original)

Java代码如下:

package test_java;import java.io.IOException;
import org.python.core.Py;
import org.python.core.PyFunction;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;public class TestIng {/*** @param args* @throws IOException * @throws InterruptedException */public static void main(String[] args) throws IOException {System.setProperty("python.home", "D:\\java_test\\lib\\jython-standalone-2.5.3.jar");// 1. Python面向函数式编程: 在Java中调用Python函数String pythonFunc = "D:\\java_test\\Script\\Original.py";PythonInterpreter pi1 = new PythonInterpreter();// 加载python程序
        pi1.execfile(pythonFunc);// 调用Python程序中的函数PyFunction pyf = (PyFunction) pi1.get("addse", PyFunction.class);PyObject dddRes = pyf.__call__(Py.newDecimal("https://***********.com/new/#/register/h5?args=eyJ0ZW5hbnROYW1lIjoiQUEyQkwiLCJzaGFyZVBhcmFtIjoibjM0Z0MvNHVGek5pVFdGRk1UTml1SFREUWhSUzZxNVV3NmVUSlp6cThabGF6ZVdjK0p4cWNnPT0ifQ%3d%3d"
));System.out.println(dddRes);pi1.cleanup();pi1.cleanup();}
}

修改完参数,直接运行,狂吃,喜提报错 :

原因:根据报错内容,可以知道是Python文件中引入的第三方包没有找到或者Python版本问题。

 解决办法:直接把Python代码用Python2.7的语法重写。即可解决

Python2.7语法的代码如下:

import urlparse
import base64
import astdef addse(Originals):# 解码url_org = urlparse.unquote(Originals)# 提取 args参数parameter1 = urlparse.urlparse(url_org)parameter2 = urlparse.urlparse(parameter1.fragment)# # base64位解码args参数并切片截取值parameter3 = base64.b64decode(parameter2.query[5:])parameter5 = ast.literal_eval(str(parameter3))# # 通过for循环将字典中的值取出for i in parameter5:print "%s = %s" %(i,parameter5[i])if __name__ == "__main__":Original = "https://xxxxxxxxxxx.com/new/#/register/h5?args=eyJ0ZW5hbnROYW1lIjoiQUEyQkwiLCJzaGFyZVBhcmFtIjoibjM0Z0MvNHVGek5pVFk1UTml1S11231SUzZxNVV3NmVUSlp6cThabGF6ZVdjK0p4cWNnPT0ifQ%3d%3d"addse(Original )

再次试运行,,,,幺吼,又翻车了,换了个错继续报:

原因:提示说,Original没有被定义。

解决办法:修改Python代码,不要初始化相关的信息:if __name__ == "__main__":

此时在运行,,OMG又他么报错了

事实证明此时我的程序是通了的,但是我太菜了因为各种语法规则问题导致一直报错问题就出在 :url_org = urlparse.unquote(Originals) 这一句上;

原因:在调用Python程序时,其中的unquote这个在urlparse这个中没有(在pycharm中同样的这一句却是可以正常成功的,好奇为啥通过Java去调就失败)。看了一下在Python2.7中关于解码的方法调用。将解码这一句改成:url_org = urllib.unquote_plus(Originals)   在一执行,奇迹出现了 ,沃德玛雅,终于在控制台看到了我想要的结果。

其实还是有点小激动的。你们是不知道像我这样太菜的人去搞这些是有多痛苦。不过解决了所有问题,看到了成功的时候还是很激动的。

这个就先这样吧 ,吧这些代码打成jar包,放在jmeter里,当做正常的jar包去调用就好了 ,具体的后续在更新》》》》》》》

参考文章:

https://www.cnblogs.com/nuccch/p/8435693.html

转载于:https://www.cnblogs.com/Zhan-W/p/11574222.html

jmeter调用Python脚本(java调用Python程序)阶段一(可实现版)相关推荐

  1. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境...

    0在Python脚本中调用Django环境. import osif __name__ == '__main__': os.environ.setdefault("DJANGO_SETTIN ...

  2. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  3. django调用python脚本返回_Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境...

    单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的settin ...

  4. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  5. Python脚本导出为exe程序

    环境:Pycharm2019.1 + Win10 + Python3.7.3 一.pyinstaller简介 Python是一个脚本语言,被解释器解释执行.它的发布方式: .py文件:对于开源项目或者 ...

  6. linux停止运行python_如何从LinuxOS中的python脚本运行/停止c程序?

    我有一个c程序基本上是在无限循环运行,如下所示. int main(int argc, char** argv ) { Detectdirection *d; //Mosquitto io_servi ...

  7. python从外部传入参数_从另一个Python脚本运行一个Python脚本,并传入参数 - python...

    我想从另一个Python脚本运行一个Python脚本.我想像使用命令行一样传递变量. 例如,我将运行我的第一个脚本,该脚本将遍历值列表(0.1.2.3),并将其传递给第二个脚本,依次为script2. ...

  8. python和java哪个-Python和Java两门编程语言,学习哪个更好?

    首先,在选择学习Java编程语言还是Python编程语言之前,得明白自己学习编程的目的是什么?是为了学会变成后跳入互联网企业工作,为转行做准备:还是想快速入门编程语言,学习一份技能傍身,为将来做打算. ...

  9. xShell运行Python脚本报错 Python script error 80040154

    xShell运行Python脚本报错 Python script error 80040154 这是由于没有安装 Python engine的原因. 解决方法如下: 1. 下载并安装 Python 访 ...

  10. linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...

    我正在开发一个Java应用程序,用于检查源文件中的补丁程序(是否存在). 用于检测补丁程序更改的核心逻辑位于python脚本[titled'patch.py​​']中,并且我的Java应用程序与此Py ...

最新文章

  1. MPB:湖南师大尹佳组-​乳酸菌对酸和胆碱盐的耐受能力
  2. sphinx索引分析续
  3. VLC-DSS搭建直播系统中链路断开影响测试
  4. 分类系统的构成与外部表象
  5. 学习笔记:The Log(我所读过的最好的一篇分布式技术文章
  6. 突然被工信部重罚!阿里云到底干了啥?
  7. Python_堆栈和队列
  8. canvas 图片反色
  9. 2018最新Java面试78题:数据结构+网络+NoSQL+分布式架构
  10. No dashboards are active for the current data set. 解决tensorboard无法启动和显示问题
  11. mysql group by cube_SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
  12. HFSS入门学习(一)
  13. 『原创经典』标准日本语初级笔记完整版(1)
  14. linux ps -ang,PS顶级一键人像修图插件-DeliciousRetouchPlus
  15. ngx_lua arg类型_使用模式,Arg和类型微调Drupal主题
  16. 计算机里s大小,衣服上的S,M,L代表m或l多大
  17. 【技术类】ArcGIS里做影像分幅裁剪
  18. Android开发系统应用程序
  19. webshell管理之中国菜刀 蚁剑 WeBaCoo Weevely
  20. linux越狱80x24,用Cydia Impactor 免越狱安装未签名APP方法[日常] | 贝贝吧

热门文章

  1. 区块链技术在“三资”监管领域的应用
  2. 拖机软件Betwinnbsp;VSnbsp;2.0.0.368+破解…
  3. 教孩子学编程python pdf_教孩子学编程 PYTHON语言版 PDF_IT教程网
  4. 计算机课ppt实验报告,北邮计算机组成原理实验课件_bupt 计算机组成原理 实验报告,北邮 计算机 计组实验-讲义工具类资源...
  5. Activiti7使用
  6. FMEA软件框图及接口功能库(FMEAHunter)
  7. ARM Keil5下载安装并导入STM32芯片
  8. python视频培训班
  9. 微信小程序之海报生成
  10. luarocks argparse