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


Related articles: