当前位置: 移动技术网 > IT编程>开发语言>Java > Java与Python之间使用jython工具类实现数据交互

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

2019年07月19日  | 移动技术网IT编程  | 我要评论

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

总结

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网