最新公告
  • 欢迎您光临立业阁,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • java后端如何调python接口_python教程


    最近在做项目的时候,需要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教程栏目进行学习!

    以上就是java后端如何调python接口的详细内容,更多请关注liyege.cn其它相关文章!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    • 1162会员总数(位)
    • 111858资源总数(个)
    • 8本周发布(个)
    • 0 今日发布(个)
    • 242稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    冀ICP备19022365号-1 百度地图

    侵权联系邮箱[email protected]

    立业阁(www.liyege.cn)免费提供wordpress主题模板、dedecms模板、帝国cms模板、小说网站源码、电影网站源码以及网络技术分享,建站源码,小说模板,电影模板,网赚教程,VPS推荐