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

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

1、开始各类百度找思路,最终大概流程就是这个样子的(如下全部操做均在window下进行)。java

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

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

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

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

  五、安装Python编辑器(本人所用为:PyCharm);函数式编程

  六、配置jython环境变量;函数

  七、编写Python测试脚本;测试

  八、新建Java项目;编码

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

  十、编写Java测试脚本;

  十一、调试;

2、接下来就让咱们一块儿来踩坑、填坑吧,吼吼吼~

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

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

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

  三、安装并配置Python环境

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

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

  四、安装Java编辑器Eclipse

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

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

  六、配置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, 系统找不到指定的文件。)

  七、编写Python测试脚本,以下:

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

  八、新建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)、选择新建的包右键新建类,填写类名称,保存;

  九、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文件目录;

  十、编写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 math
def 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了 。

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

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

# -*- coding: utf-8 -*-
import base64 import ast import urllib.parse def 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 ast def 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包去调用就行了 ,具体的后续在更新》》》》》》》

 

 

参考文章:

http://www.javashuo.com/article/p-ppcogumr-gy.html

相关文章
相关标签/搜索