java调用Python函数

前提

公司渔船轨迹混乱,需要算法修正,算法用Python开发,java代码需要调用Python函数,于是我就研究了一下如何通过java使用Python,以下就是一些调用Python的步骤。

本文以springboot项目为案例简述调用Python的方式
1、引入依赖
 <dependency>
      <groupId>org.python</groupId>
      <artifactId>jython-standalone</artifactId>
      <version>2.7.0</version>
 </dependency>
2、编写Python

将Python代码放入static下面
在这里插入图片描述

3、简单调用Python中的add方法

java的类型必须转成Python类型,否则会报错
PyObject 的返回结果可以通过toString获取

 @GetMapping("/add")
    public String add() {
        //获取Python文件
        String path = this.getClass().getClassLoader().getResource("").getPath() + "static/python/lineAdress.py";
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile(path);
        // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
        PyFunction pyFunction = interpreter.get("add", PyFunction.class);
        //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
        PyObject pyobj = pyFunction.__call__(new PyInteger(1),new PyInteger(2));
        //PyObject 的返回结果可以通过toString获取
        return pyobj.toString();
    }

请求结果:
在这里插入图片描述

3、将对象传递给Python的函数,并转成字典类型

这是RequestBean 的json字符串
{"data":[{"mchNo":"123"}]}
java代码:
将RequestBean 的对象先转成json字符串,然后在封装成Python类型
Py.java2py(jsonRequest)

 @GetMapping("/test")
    public String test() {
        String path = this.getClass().getClassLoader().getResource("").getPath() + "static/python/lineAdress.py";
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile(path);
        // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
        PyFunction pyFunction = interpreter.get("getJson", PyFunction.class);
        //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
        RequestBean requestBean = new RequestBean();
        List<LocationBean> dataList = new ArrayList<>();
        requestBean.setData(dataList);
        LocationBean locationBean = new LocationBean();
        locationBean.setMchNo("123");
        dataList.add(locationBean);
        String jsonRequest = JSON.toJSONString(requestBean);
        //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
        PyObject pyobj = pyFunction.__call__(Py.java2py(jsonRequest));
        return pyobj.toString();
    }

Python代码:
首先映入ast,用于将字符串转成字典类型
在这里插入图片描述
记住一定要将java传递的参数转成字典,否则取值会报错,因为java传递过来的是字符串。这里建议使用ast,当然使用json也可以转化,但是会有多余的字符出现
ast.literal_eval()
在这里插入图片描述
执行结果:
在这里插入图片描述


版权声明:本文为k393393原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。