溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java后端調python接口的方法

發(fā)布時間:2020-08-24 13:58:28 來源:億速云 閱讀:896 作者:小新 欄目:編程語言

這篇文章主要介紹java后端調python接口的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

最近在做項目的時候,需要java 調用 python 接口,在網上找了一些方法,但是總碰到一些問題,索性將網上的方法和自己的理解總結一下,希望對各位有所幫助,也請各位大神不吝賜教。

java后端調python接口的方法

此方法需要引用 org.python包,需要下載Jpython。在這里先介紹一下Jpython。下面引入百科的解釋:

Jython是一種完整的語言,而不是一個Java翻譯器或僅僅是一個Python編譯器,它是一個Python語言在Java中的完全實現。Jython也有很多從CPython中繼承的模塊庫。最有趣的事情是Jython不像CPython或其他任何高級語言,它提供了對其實現語言的一切存取。所以Jython不僅給你提供了Python的庫,同時也提供了所有的Java類。這使其有一個巨大的資源庫。

一:創(chuàng)建環(huán)境 Python 環(huán)境

import org.python.util.PythonInterpreter;

import java.util.Properties;

/**
 * Jython環(huán)境,獲取Python的實例
 * @author webim
 *
 */
public class JythonEnvironment {

    //定義一個靜態(tài)變量
    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 腳本文件執(zhí)行失敗");
        }
    }

    //獲取 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接口的方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI