您好,登錄后才能下訂單哦!
這篇文章主要介紹java后端調python接口的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
最近在做項目的時候,需要java 調用 python 接口,在網上找了一些方法,但是總碰到一些問題,索性將網上的方法和自己的理解總結一下,希望對各位有所幫助,也請各位大神不吝賜教。
此方法需要引用 org.python包,需要下載Jpython。在這里先介紹一下Jpython。下面引入百科的解釋:
Jython是一種完整的語言,而不是一個Java翻譯器或僅僅是一個Python編譯器,它是一個Python語言在Java中的完全實現。Jython也有很多從CPython中繼承的模塊庫。最有趣的事情是Jython不像CPython或其他任何高級語言,它提供了對其實現語言的一切存取。所以Jython不僅給你提供了Python的庫,同時也提供了所有的Java類。這使其有一個巨大的資源庫。
一:創建環境 Python 環境
import org.python.util.PythonInterpreter; import java.util.Properties; /** * Jython環境,獲取Python的實例 * @author webim * */ public class JythonEnvironment { //定義一個靜態變量 private static JythonEnvironment INSTANCE = new JythonEnvironment(); /** * 私有構造方法 */ private JythonEnvironment() { } /** * 獲取單例 * @return JythonEnvironment */ public static JythonEnvironment getInstance() { return INSTANCE; } /** * 獲取python解釋器 * @return PythonInterpreter */ public PythonInterpreter getPythonInterpreter() { Properties props = new Properties(); props.put("python.home","path to the Lib folder"); props.put("python.console.encoding", "UTF-8"); // Used to prevent: console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0. props.put("python.security.respectJavaAccessibility", "false"); //don't respect java accessibility, so that we can access protected members on subclasses props.put("python.import.site","false"); Properties preprops = System.getProperties(); //對 python 進行初始化 PythonInterpreter.initialize(preprops, props, new String[0]); PythonInterpreter inter = new PythonInterpreter(); return inter; } }
二:調用 python 的接口
因為 python 和 java是兩種不同的語言,因此在項目的 controller 、service 和 mapper 中直接出現 Python 的接口,因此自己封裝ExecPython 類,
封裝python的接口,目的讓 python 接口和java程序分隔開。
import org.python.core.PyFunction; import org.python.core.PyObject; import org.python.util.PythonInterpreter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import java.util.Map; /*enum的這個用法,可以作為變種的安全單例,值得借鑒哦 ^_^ */ @Service @Component public class ExecPython { public static final Logger logger = LoggerFactory.getLogger(Exception.class); //定義 python 解釋器 private static PythonInterpreter inter; public ExecPython() { this.inter = JythonEnvironment.getInstance().getPythonInterpreter(); this.inter.execfile("C:\\test.py"); } //設置 python 腳本的路徑 public void setPythonPath (String pythonPath){ this.inter.execfile(pythonPath); } public void execute(String scriptFile, Map<String,String> properties) { logger.info("獲取解釋器"); try { PyFunction getNetInfo = (PyFunction) inter.get("getNetInfo", PyFunction.class); PyObject netInfo = getNetInfo.__call__(); System.out.println("anwser = " + netInfo.toString()); } catch (Exception e) { e.printStackTrace(); logger.info("Python 腳本文件執行失敗"); } } //獲取 Python 字符串 public String getString(){ //獲取到python 腳本中的接口 PyFunction func = (PyFunction) inter.get("adder", PyFunction.class); PyObject pyobj = func.__call__(); System.out.println("anwser = " + pyobj.toString()); return pyobj.toString(); } // 獲取當前數組 public String getArr() { PyFunction getArr = (PyFunction) inter.get("getArr", PyFunction.class); PyObject pyobjTwo = getArr.__call__(); pyobjTwo.__len__(); System.out.println("anwser = " + pyobjTwo.toString()+" len:"+pyobjTwo.__len__()); //將 PyObject 對象轉換成 java 對象 //Object object = pyobjTwo.__tojava__(List.class); //List<String> list = (List<String>) object; //將查詢到數據轉換成一個 JSON 字符串 String result = pyobjTwo.toString(); String JsonStr = "{" + result + "}"; logger.info(JsonStr); logger.info("將查詢的結果轉換成 JSON 字符串:",JsonStr); return pyobjTwo.toString(); } }
以上是java后端調python接口的方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。