Java與Python之間使用jython工具類(lèi)實(shí)現(xiàn)數(shù)據(jù)交互
最近有個(gè)功能需要java與python之間的數(shù)據(jù)交互,java需要把參數(shù)傳給python,然后python計(jì)算的結(jié)果返回給java.于是就寫(xiě)了一個(gè)工具類(lèi).
首先,maven 需要加載jython的依賴(lài).工具類(lèi)代碼如下:
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 工具類(lèi))
* @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,根據(jù)系統(tǒng)中該文件目錄路徑
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]);
//創(chuàng)建PythonInterpreter 對(duì)象
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 源碼文件中的某個(gè)方法)
* @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(執(zhí)行無(wú)參方法,返回PyObject)
* @param: @param func
* @return: PyObject
* @throws
*/
public static PyObject execFunc(PyFunction func){
PyObject pyobj = func.__call__();
return pyobj;
}
/**
* @Title: execFuncToString
* @Description: TODO(執(zhí)行無(wú)參方法,返回一個(gè)字符串)
* @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(執(zhí)行有參方法,返回一個(gè)字符串)
* @param: @param func
* @param: @param paramName ,參數(shù)名
* @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(執(zhí)行無(wú)參方法,返回一個(gè)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(執(zhí)行無(wú)參方法,返回一個(gè)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(執(zhí)行無(wú)參方法,返回一個(gè)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);
//函數(shù)名
String functionName = "count";
PyFunction func = loadPythonFunc(interp, functionName);
//執(zhí)行無(wú)參方法,返回PyObject
PyObject pyobj = execFunc(func);
//執(zhí)行無(wú)參方法,返回String
String resultStr = execFuncToString(func);
//執(zhí)行有參方法,返回String
String paramName = "name";
String resultStr2 = execFuncToString2(func, paramName);
}
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
使用springboot對(duì)linux進(jìn)行操控的方法示例
這篇文章主要介紹了使用springboot對(duì)linux進(jìn)行操控的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
java servlet手機(jī)app訪問(wèn)接口(二)短信驗(yàn)證
這篇文章主要介紹了java servlet手機(jī)app訪問(wèn)接口(二),短信驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
SpringBoot整合weixin-java-pay實(shí)現(xiàn)微信小程序支付的示例代碼
微信小程序支付是常見(jiàn)的一種功能,本文主要介紹了SpringBoot整合weixin-java-pay實(shí)現(xiàn)微信小程序支付的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Java從數(shù)據(jù)庫(kù)中讀取Blob對(duì)象圖片并顯示的方法
這篇文章主要介紹了Java從數(shù)據(jù)庫(kù)中讀取Blob對(duì)象圖片并顯示的方法,實(shí)例分析了Java讀取數(shù)據(jù)庫(kù)中Blob對(duì)象圖片的技巧與操作方法,需要的朋友可以參考下2015-02-02
SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證
本文主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)權(quán)限認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

