这篇笔记主要记录了我使用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 = ''+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 = ''+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]);

jython笔记的更多相关文章

  1. jython学习笔记3

    1.os.environ["HOME"] 为什么这句话在我的STS中打印不出东西,还报错 Method Description close() Close file fileno( ...

  2. jython语言学习笔记

    1.变量可以随便定义,不限制类型,不限制数值.开头空4个空格,使用def定义函数,可以嵌套,可以传参. 2.每个语句结束的时候没有分号.定义类的时候没有括号.在print语句的后面有格式转换时要加上% ...

  3. 用Java执行Python:Jython踩坑笔记

    常见的java调用python脚本方式 1.通过Jython.jar提供的类库实现 2.通过Runtime.getRuntime()开启进程来执行脚本文件 1.Jython Jpython使用时,版本 ...

  4. jython学习笔记2

    1.%是求余,//是整除的商,**是乘方 abs(var) Absolute value pow(x, y) Can be used in place of ** operator pow(x,y,m ...

  5. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  6. Python学习笔记(一)基础

    学习资料 跟着廖雪峰的Python教程学习Python,大家可以去官方网站查看学习教程.使用的Python版本为3.0.x,解释器为CPython.本系列博客为学习笔记,记录跟随廖老师所学知识,同时会 ...

  7. 《深入理解Java虚拟机》学习笔记之类加载

    之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...

  8. Python学习笔记【第一篇】:认识python和基础知识

    我的笔记里的python代码运行环境都是在pycharm软件中运行,所以不去记录如何配置环境变量呀什么的. python种类 Cpython: Python的官方版本,使用C语言实现,使用最为广泛,C ...

  9. 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势

    0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...

随机推荐

  1. C#字符串string以及相关内置函数

    C#字符串string函数 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  2. URL diff URI

    很多人会混淆这两个名词. URL:(Uniform/Universal Resource Locator 的缩写,统一资源定位符). URI:(Uniform Resource Identifier ...

  3. HDU 1087:Super Jumping! Jumping! Jumping!(LIS)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. 04 jsp,EL,JSTL

    jsp:Java Server Page  什么是jsp?从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了servlet,所以可以直接说jsp 就是一个Se ...

  5. hdu4705 Y 树形DP

    给出一颗数,求没有一条路径穿过的节点三元集合个数. 这样的三元集合呈现Y字形,求出反面情况,三点为子节点和两个祖先节点,或一个祖先节点与它子树中非父子关系的节点.可由树形DP求得. #pragma c ...

  6. 【spring源码分析】spring ioc容器之前生今世--DefaultListableBeanFactory源码解读

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  7. POJ2480 Longge's problem

    题意 Language:Default Longge's problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1064 ...

  8. 用setuptools_scm来自动控制Python包的版本

    手动管理Python包的版本号一段时间后,寻求自动化的手段,是自然而然的. 手动管理版本 手动管理Python包的版本,需要注意两个方面: 每次发布新包前,要更新包的版本号. 在安装后的默认模块下应该 ...

  9. C++中的抽象类

    一.抽象类学习笔记 1.virtual修饰函数(虚函数)后面加=0就称为一个纯虚函数,一个类中只要有纯虚函数那么它就是一个抽象类.抽象类不能用来实例化对象,是用来给他的派生类定义好这些框架的,给使用这 ...

  10. debezium sql server 集成

    debezium 是一个方便的cdc connector 可以帮助我们解决好多数据实时变更处理.数据分析.微服务的数据通信 从上次跑简单demo到现在,这个工具是有好多的变更,添加了好多方便的功能,支 ...