Data interaction between Java and Python using jython tool class
- 2021-07-01 07:39:00
- OfStack
Recently, there is a function that requires data interaction between java and python. java needs to pass parameters to python, and then the calculation results of python are returned to java. So I wrote a tool class.
First, maven needs to load the dependencies of jython. The tool class code is as follows:
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 Tool class )
* @author: zy
* @date:
*
* @Copyright: 2018 Inc. All rights reserved.
* Note:
*/
public class JythonUtils {
/**
* @Title: jythonInit
* @Description: TODO( Initialization jython)
* @param: @return
* @return: PythonInterpreter
* @throws
*/
public static PythonInterpreter jythonInit(){
// Initialization site Configure
Properties props = new Properties();
props.put("python.home", ""); //python Lib Or jython Lib, According to the file directory path in the system
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]);
// Create PythonInterpreter Object
PythonInterpreter interp = new PythonInterpreter();
return interp;
}
/**
* @Title: loadPythonFile
* @Description: TODO( Loading python Source code file, )
* @param: @param interp
* @param: @param filePath For example: F:\\jpython_jar\\jpythonTest\\pythonTest.py Or /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( Loading python A method in the source file )
* @param: @param interp
* @param: @param functionName
* @param: @return
* @return: PyFunction
* @throws
*/
public static PyFunction loadPythonFunc(PythonInterpreter interp, String functionName){
// Loading method
PyFunction func = (PyFunction) interp.get(functionName,PyFunction.class);
return func;
}
/**
* @Title: execFunc
* @Description: TODO( Execute a parametric method , Return PyObject)
* @param: @param func
* @return: PyObject
* @throws
*/
public static PyObject execFunc(PyFunction func){
PyObject pyobj = func.__call__();
return pyobj;
}
/**
* @Title: execFuncToString
* @Description: TODO( Execute a parametric method , Return 1 String )
* @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( Execute parametric methods , Return 1 String )
* @param: @param func
* @param: @param paramName , parameter name
* @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( Execute a parametric method , Return 1 A 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( Execute a parametric method , Return 1 A 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( Execute a parametric method , Return 1 A 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();
// Filename
String filePath = "F:\\jpython_jar\\jpythonTest\\pythonTest.py";
interp = loadPythonFile(interp, filePath);
// Function name
String functionName = "count";
PyFunction func = loadPythonFunc(interp, functionName);
// Executes the parameterless method and returns PyObject
PyObject pyobj = execFunc(func);
// Executes the parameterless method and returns String
String resultStr = execFuncToString(func);
// Executes the parameterized method and returns String
String paramName = "name";
String resultStr2 = execFuncToString2(func, paramName);
}
}
Summarize