java后端如何调python接口


本文摘自php中文网,作者(*-*)浩,侵删。

最近在做项目的时候,需要java 调用 python 接口,在网上找了一些方法,但是总碰到一些问题,索性将网上的方法和自己的理解总结一下,希望对各位有所帮助,也请各位大神不吝赐教。

此方法需要引用 org.python包,需要下载Jpython。在这里先介绍一下Jpython。下面引入百科的解释:(推荐学习:Python视频教程)

Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。

一:创建环境 Python 环境

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

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程序分隔开。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

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();

    }

}

更多Python相关技术文章,请访问Python教程栏目进行学习!

以上就是java后端如何调python接口的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python global用法

Python写的贪吃蛇游戏例子_Python

Python的cmd命令行在哪里

Python用什么文本编辑器

如何用Python实现微信消息防撤回

Python数据可视化利器matplotlib详解

Python线程下timer对象、lock对象和rlock对象的简单介绍

Python实现删除时保留特定文件夹和文件的示例

Python有哪些需要学习的知识?

比较Python和ruby

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...