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

作者:texture_texture 时间:2023-10-06 18:44:09 

最近有个功能需要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);
}
}

来源:https://blog.csdn.net/cafebar123/article/details/79394431

标签:java,python,数据交互,工具类
0
投稿

猜你喜欢

  • 一文吃透Go的内置RPC原理

    2024-02-03 08:45:53
  • XML 增、删、改和查示例

    2008-09-05 17:12:00
  • Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析

    2022-08-29 11:18:20
  • asp如何用JMail POP3接收电子邮件?

    2010-06-13 13:09:00
  • 细说Go语言中空结构体的奇妙用途

    2024-04-23 09:46:09
  • Python+Tkinter制作猜灯谜小游戏

    2021-09-24 19:43:17
  • 理解 javascript 中的函数表达式与函数声明

    2024-04-23 09:08:26
  • 详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击

    2023-03-16 14:33:51
  • 你还在 Select * 吗?

    2024-01-24 22:10:50
  • 高级MySQL数据库面试问题 附答案

    2024-01-13 17:38:10
  • Django 解决开发自定义抛出异常的问题

    2023-03-05 12:43:55
  • 基于go+vue实现的golang每日新闻数据浏览与检索平台(推荐)

    2023-06-16 12:11:26
  • python3 下载网络图片代码实例

    2021-11-21 01:11:40
  • python实现自主查询实时天气

    2021-07-02 22:43:09
  • Python判断某个用户对某个文件的权限

    2023-12-15 01:25:27
  • 在ASP中改善动态分页的性能

    2008-05-08 14:27:00
  • Opencv图像处理:如何判断图片里某个颜色值占的比例

    2023-09-27 16:57:40
  • python中pip的安装与使用教程

    2021-06-10 23:37:36
  • python装饰器使用方法实例

    2022-12-14 11:24:07
  • MySQL如何计算连续登录天数

    2024-01-17 18:05:00
  • asp之家 网络编程 m.aspxhome.com