当前位置: 首页 > news >正文

jython笔记

这篇笔记主要记录了我使用jython的一些问题点:

首先,jython是一个Java写的用来解析python语言的工具,他可以做到运行环境中没有python也可以使用python。

jython采用的方式是优先使用本机的python2,如果没有检测到本机的python2,则会去寻找jython.rar或者本机安装好的jython运行环境。

下面是我写的一些jython的代码:

PySource,因为jython启动之后需要关闭,而且启动一个实例的时间挺长的,所以最好是做成静态类:

package com.shinho.bi.db;
 
 import org.python.util.PythonInterpreter;
 
 public class PySource {
     
     public static PythonInterpreter inter;
     
     public static void init(){
         inter = new PythonInterpreter();
     }
}

jython使用方法,里面有入参和出参的传递:

/**
      * 特殊数据处理方法
      * @param key 模板关键字
      * @param list 查询出来的结果集
      * @throws TemplateException 
      * @throws IOException 
      */
     public static String MathMethod(String key, String json){
         Cache<String, Object> myCache = EhcacheUtil.cacheManager.getCache("myCache", String.class, Object.class);
         Map<String, String> tpls = (Map<String, String>)myCache.get("sqls");
         String res = "";
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
         String sqlModel = tpls.get(key);
         StringWriter out = null;
         try {
             PySource.inter.set("ds", json);
             out = new StringWriter();
             PySource.inter.setOut(out);
             logger.info("begin time:"+sdf.format(new Date()));
             PySource.inter.exec(sqlModel);
             //调试的时候取本地代码
             //PySource.inter.execfile("/home/wp/Code/SQLModel/python/daily.py");
             //调试的时候取本地代码
             logger.info("end time:"+sdf.format(new Date()));
             res = out.toString();
             logger.info(res);
         } catch (Exception e) {
             e.printStackTrace();
         }finally{
             try {
                 out.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         
         return res;
    }

python模板

#coding:utf-8

import sys
import json
import time
import calendar

if __name__ == '__main__':
    model = json.loads(ds)
    rdc1 = model[0]
    goal = model[1][0]
    ly = model[1][1]
    ny = time.strftime("%Y", time.localtime())
    nm = time.strftime("%m", time.localtime())
    nd = time.strftime("%d", time.localtime())
    nym = time.strftime("%Y%m", time.localtime())
    monthRange = calendar.monthrange(int(ny),int(nm))[1]
    dayNow = int(nd)
    avg_goal = float(goal['mapList'][0]['value'])/monthRange
    avg_ly = float(ly['mapList'][0]['value'])/monthRange
    rdcList = []
    goalList = []
    lyList = []
    vsGoal = []
    vsLy = []
    vsGoalLv = []
    vsLyLv = []
    i = 1
    nowBgt = 0
    nowLy = 0
    while (i <= monthRange):
        dd = str(i)
        if i < 10:
            dd = '0'+str(i)
        nowBgt = nowBgt + avg_goal
        nowLy = nowLy + avg_ly
        goalMap = {'key': nym + dd, 'value': nowBgt}
        lyMap = {'key': nym + dd, 'value': nowLy}
        goalList.append(goalMap)
        lyList.append(lyMap)
        i = i+1
    goalCard = {'index': 'MRL2', 'mapList': goalList}
    lyCard = {'index': 'MRL3', 'mapList': lyList}
    nowVal = 0
    i = 1
    while (i <= dayNow):
        dd = str(i)
        if i < 10:
            dd = '0'+str(i)
        if i-1 < len(rdc1[0]["mapList"]):
            key = rdc1[0]["mapList"][i-1]["key"]
            value = 0
            if key == nym + dd:
                value = float(rdc1[0]["mapList"][i-1]["value"])
            else:
                value = 0
        else:
            value = 0
        nowVal = nowVal + value
        rdcMap = {'key': nym + dd, 'value': nowVal}
        rdcList.append(rdcMap)
        dayGoal = 0
        dayLy = 0
        for gMap in goalList:
            if gMap["key"] == (nym + dd) :
                dayGoal = float(gMap["value"])
                break
        for lMap in lyList:
            if lMap["key"] == (nym + dd):
                dayLy = float(lMap["value"])
                break
        # 计算vs
        vsGoalMap = {'key': nym + dd, 'value': (nowVal-dayGoal)}
        vsLyMap = {'key': nym + dd, 'value': (nowVal-dayLy)}
        vsGoal.append(vsGoalMap)
        vsLy.append(vsLyMap)
        vsGoalLvMap = {'key': nym + dd, 'value': (nowVal/dayGoal)-1}
        vsLyLvMap = {'key': nym + dd, 'value': (nowVal/dayLy)-1}
        vsGoalLv.append(vsGoalLvMap)
        vsLyLv.append(vsLyLvMap)
        i = i+1;
    rdcCard = {'index': 'MRL1', 'mapList': rdcList}
    vsGoalCard = {'index': 'MRL4', 'mapList': vsGoal}
    vsLyCard = {'index': 'MRL5', 'mapList': vsLy}
    vsGoalLvCard = {'index': 'MRL6', 'mapList': vsGoalLv}
    vsLyLvCard = {'index': 'MRL7', 'mapList': vsLyLv}
    resList = [rdcCard, goalCard, lyCard, vsGoalCard, vsLyCard, vsGoalLvCard, vsLyLvCard]
    print resList

最后,是如何控制jython使用本机python的,指定python路径:

其中只有第一个put有用哦

Properties props = new Properties();
props.put("python.path", "/usr/bin/python");
props.put("python.console.encoding", "UTF-8");        
props.put("python.security.respectJavaAccessibility", "false");        
props.put("python.import.site", "false");

Properties preprops = System.getProperties();
PythonInterpreter.initialize(preprops, props, new String[0]);

 

转载于:https://www.cnblogs.com/wpcnblog/p/9649991.html

相关文章:

  • mpvue 临时关闭eslint
  • ACM-ICPC 2018 焦作赛区网络预赛
  • iOS开发,轻松获取根控制器当前控制器的正确方式
  • set_uid、set_gid、stick_bit、软链接和硬连接文件
  • 0006-20180422-自动化第七章-python基础学习笔记
  • 【计算机网络】OSI七层模型图解
  • Java多线程全揭秘
  • 特殊权限set_uid/ set_gid /stick_bit,软链接、硬链接
  • 源码分析----Mybatis数据源与连接池
  • const 有什么用途
  • 架构师的工作都干些什么?!想做架构师必看!
  • 解决 PHPStorm 打开项目一直 indexing 的问题
  • 学以致用十二-----YouCompeteMe巨坑
  • nginx 80端口重定向到443端口
  • [Poetize6] IncDec Sequence
  • [PHP内核探索]PHP中的哈希表
  • JavaScript-如何实现克隆(clone)函数
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 「译」Node.js Streams 基础
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ComponentOne 2017 V2版本正式发布
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux链接文件
  • Next.js之基础概念(二)
  • python学习笔记-类对象的信息
  • Rancher-k8s加速安装文档
  • Vue 2.3、2.4 知识点小结
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端代码风格自动化系列(二)之Commitlint
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 延迟脚本的方式
  • ​flutter 代码混淆
  • #define用法
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (27)4.8 习题课
  • (function(){})()的分步解析
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十三)Flask之特殊装饰器详解
  • (数据结构)顺序表的定义
  • (一一四)第九章编程练习
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)树状数组
  • (转)项目管理杂谈-我所期望的新人
  • (转载)深入super,看Python如何解决钻石继承难题
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .form文件_SSM框架文件上传篇
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET LINQ 通常分 Syntax Query 和Syntax Method