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:   2018年2月10日 下午5:24:40   
 *     
 * @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);
 }
}

發佈了61 篇原創文章 · 獲贊 42 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章