Java与Python之间使用jython工具类实现数据交互

最近有个功能需要java与python之间的数据交互,java需要把参数传给python,然后python计算的结果返回给java.于是就写了一个工具类.

首先,maven 需要加载jython的依赖.工具类代码如下:

import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.poi.ss.formula.functions.T;
import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.util.PythonInterpreter;
/**
 * @ClassName: JythonUtils
 * @Description:TODO(jython 工具类)
 * @author: zy
 * @date:
 *
 * @Copyright: 2018 Inc. All rights reserved.
 * 注意:
 */
public class JythonUtils {
 /**
 * @Title: jythonInit
 * @Description: TODO(初始化jython)
 * @param: @return
 * @return: PythonInterpreter
 * @throws
 */
 public static PythonInterpreter jythonInit(){
 //初始化site 配置
 Properties props = new Properties();
    props.put("python.home", ""); //python Lib 或 jython Lib,根据系统中该文件目录路径
    props.put("python.console.encoding", "UTF-8");
    props.put("python.security.respectJavaAccessibility", "false");
    props.put("python.import.site", "false");
    Properties preprops = System.getProperties();
    PythonInterpreter.initialize(preprops, props, new String[0]);
    //创建PythonInterpreter 对象
 PythonInterpreter interp = new PythonInterpreter();
 return interp;
 }
 /**
 * @Title: loadPythonFile
 * @Description: TODO(加载python 源码文件,)
 * @param: @param interp
 * @param: @param filePath ,比如:F:\\jpython_jar\\jpythonTest\\pythonTest.py 或/testpython/test.py
 * @param: @return
 * @return: PythonInterpreter
 * @throws
 */
 public static PythonInterpreter loadPythonFile(PythonInterpreter interp, String filePath){
 interp.execfile(filePath);
 return interp;
 }
 /**
 * @Title: loadPythonFunc
 * @Description: TODO(加载python 源码文件中的某个方法)
 * @param: @param interp
 * @param: @param functionName
 * @param: @return
 * @return: PyFunction
 * @throws
 */
 public static PyFunction loadPythonFunc(PythonInterpreter interp, String functionName){
 //加载方法
   PyFunction func = (PyFunction) interp.get(functionName,PyFunction.class);
 return func;
 }
 /**
 * @Title: execFunc
 * @Description: TODO(执行无参方法,返回PyObject)
 * @param: @param func
 * @return: PyObject
 * @throws
 */
 public static PyObject execFunc(PyFunction func){
 PyObject pyobj = func.__call__();
 return pyobj;
 }
 /**
 * @Title: execFuncToString
 * @Description: TODO(执行无参方法,返回一个字符串)
 * @param: @param func
 * @param: @return
 * @return: String
 * @throws
 */
 public static String execFuncToString(PyFunction func){
 PyObject pyobj = execFunc(func);
 return (String) pyobj.__tojava__(String.class);
 }
 /**
 * @Title: execFuncToString
 * @Description: TODO(执行有参方法,返回一个字符串)
 * @param: @param func
 * @param: @param paramName ,参数名
 * @param: @return
 * @return: String
 * @throws
 */
 public static String execFuncToString2(PyFunction func, String paramName){
 PyObject pyobj = func.__call__(new PyString(paramName));
 return (String) pyobj.__tojava__(String.class);
 }
 /**
 * @Title: execFuncToInteger
 * @Description: TODO(执行无参方法,返回一个Integer)
 * @param: @param func
 * @param: @return
 * @return: Integer
 * @throws
 */
 public Integer execFuncToInteger(PyFunction func){
 PyObject pyobj = execFunc(func);
 return (Integer) pyobj.__tojava__(Integer.class);
 }
 /**
 * @Title: execFuncToList
 * @Description: TODO(执行无参方法,返回一个List)
 * @param: @param func
 * @param: @return
 * @return: List<T>
 * @throws
 */
 public List<T> execFuncToList(PyFunction func){
 PyObject pyobj = execFunc(func);
 return (List<T>) pyobj.__tojava__(List.class);
 }
 /**
 * @Title: execFuncToMap
 * @Description: TODO(执行无参方法,返回一个Map<String, Object>)
 * @param: @param func
 * @param: @return
 * @return: Map<String,Object>
 * @throws
 */
 public Map<String, Object> execFuncToMap(PyFunction func){
 PyObject pyobj = execFunc(func);
 return (Map<String, Object>) pyobj.__tojava__(Map.class);
 }
 public void execFuncToByParamsList(PyFunction func, List<T> paramsList){
 }
 public static void main(String[] args){
 PythonInterpreter interp = jythonInit();
 //文件名
 String filePath = "F:\\jpython_jar\\jpythonTest\\pythonTest.py";
 interp = loadPythonFile(interp, filePath);
 //函数名
 String functionName = "count";
 PyFunction func = loadPythonFunc(interp, functionName);
 //执行无参方法,返回PyObject
 PyObject pyobj = execFunc(func);
 //执行无参方法,返回String
 String resultStr = execFuncToString(func);
 //执行有参方法,返回String
 String paramName = "name";
 String resultStr2 = execFuncToString2(func, paramName);
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • java模拟ajax访问另一个项目的controller代码实例

    不同项目,如何java模拟ajax访问另一个项目的controller 直接上码 package com.ultrapower.zq.iscloud.web.boc.api.utils; /** * create by liujie */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import ja

  • Java中字符数组和字符串与StringBuilder和字符串转换的讲解

    1.字符串->字符数组: String str = "abc": char[] a = str.toCharArray(); 记忆:字符串是个类,所以用内建函数 延伸: char b = str.charAt(1); str.length(); a.length; 2.字符数组->字符串: String str = String.valueOf(a): 记忆:类似强制类型转换格式,String(a) 延伸:字符转字符类 Character c = Character.val

  • Javascript之高级数组API的使用实例

    JS中我们可以根据需求新建新的对象解决问题的同时,也有一些常用的内置对象供我们使用,我们称之为API,本篇文章只是对数组部分进行了练习. 例一:伪数组,不能修改长短的数组(所以没办法清零),可以修改元素,代码实现如下: <script> fn(1,2); fn(1,2,3,4,5,6); fn(1,2,4,5,7,9,4); function fn(a,b){ arguments[0]=0; console.log(arguments); arguments.push(1); console.

  • JavaScript使用小插件实现倒计时的方法讲解

    CountDown.js 一个用来实现简单页面倒计时的轻量级工具 API CountDown.openTimeCountBySeconds()根据要计时的秒数打开一个显示剩余时间的倒计时 参数: Ele: 放置倒计时的元素 CountDownSeconds: 要计时的秒数 Sign: 用于给倒计时设置标记 (可以给多个倒计时设置同一个标记) Divider: 分割时分秒的分割符 EndFunc: 倒计时结束时执行的方法 ps:以上均为可选参数 示例 CountDown.openTimeCount

  • Java多线程工具篇BlockingQueue的详解

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景. 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出: 常用的队列主要有以下两种:(当

  • Java实现批量修改txt文件名称的方法示例

    本文实例讲述了Java实现批量修改txt文件名称的方法.分享给大家供大家参考,具体如下: 最近在做特征选择的实验时,需要批量修改一下文件名称,在这里做一下记录. package com.cqu.experiment; import java.io.File; /** * @author 作者: E-mail:@126.com * @version 创建时间:2016年12月26日 下午3:02:01 类说明 */ public class RenameTxt { public static vo

  • Java中byte输出write到文件的实现方法讲解

    简述: 观察Byte值转为字符写入文件 如果在java里用byte打印出来 只有33 到 126的输出字符比较正常 此外发现Byte值为13是空格,10是换行符 知识点: 1. String 转为Byte输出("UTF-8"格式) 2. FileOutputStream 使用输出文件流 代码: package testChar; import java.io.File; import java.io.FileNotFoundException; import java.io.FileO

  • Java中Timer的schedule()方法参数详解

    timer.schedule(new MyTask(),long time1,long timer2); 今天算是彻底的搞懂了这个曾经让我为之头疼的方法.下面我就重点介绍一下: 第一个参数,是 TimerTask 类,在包:import Java.util.TimerTask .使用者要继承该类,并实现public void run() 方法,因为 TimerTask 类 实现了 Runnable 接口. 第二个参数的意思是,当你调用该方法后,该方法必然会调用 TimerTask 类 Timer

  • Java调用CXF WebService接口的两种方式实例

    通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 1.静态调用 // 创建WebService客户端代理工厂 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // 判断是否抛出异常 factory.getOutInterceptors().add(new LoggingInInterceptor()); // 注册webservic

  • Java中json与javaBean几种互转的讲解

    一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: public class Student { //姓名 private String name; //年龄 private String age; //住址 private String address; public String getName() { return name; } public void setName(String name) { this.name = name; }

随机推荐