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

网友投稿 468 2023-01-12


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 RHuZZqdAyZinterp;

}

/**

* @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

* @throws

*/

public List execFuncToList(PyFunction func){

PyObject pyobj = execFunc(func);

return (List) pyobj.__tojava__(List.class);

}

/**

* @Title: execFuncToMap

* @Description: TODO(执行无参方法,返回一个Map)

* @param: @param func

* @param: @return

* @return: Map

* @throws

*/

public Map execFuncToMap(PyFunction func){

PyObject pyobj = execFunc(func);

return (Map) pyobj.__tojava__(Map.class);

}

public void execFuncToByParamsList(PyFunction func, List 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);

}

}

总结

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Java 序列化与反序列化(Serialization)
下一篇:使用SpringSecurity处理CSRF攻击的方法步骤
相关文章

 发表评论

暂时没有评论,来抢沙发吧~