视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
java后端如何调python接口
2020-11-27 14:06:45 责编:小采
文档
 最近在做项目的时候,需要java 调用 python 接口,在网上找了一些方法,但是总碰到一些问题,索性将网上的方法和自己的理解总结一下,希望对各位有所帮助,也请各位大神不吝赐教。

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

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

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

下载本文
显示全文
专题