前提
公司渔船轨迹混乱,需要算法修正,算法用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()
执行结果: