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 = ''+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笔记的更多相关文章
- jython学习笔记3
1.os.environ["HOME"] 为什么这句话在我的STS中打印不出东西,还报错 Method Description close() Close file fileno( ...
- jython语言学习笔记
1.变量可以随便定义,不限制类型,不限制数值.开头空4个空格,使用def定义函数,可以嵌套,可以传参. 2.每个语句结束的时候没有分号.定义类的时候没有括号.在print语句的后面有格式转换时要加上% ...
- 用Java执行Python:Jython踩坑笔记
常见的java调用python脚本方式 1.通过Jython.jar提供的类库实现 2.通过Runtime.getRuntime()开启进程来执行脚本文件 1.Jython Jpython使用时,版本 ...
- jython学习笔记2
1.%是求余,//是整除的商,**是乘方 abs(var) Absolute value pow(x, y) Can be used in place of ** operator pow(x,y,m ...
- Python学习笔记—Python基础1 介绍、发展史、安装、基本语法
第一周学习笔记: 一.Python介绍 1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- Python学习笔记(一)基础
学习资料 跟着廖雪峰的Python教程学习Python,大家可以去官方网站查看学习教程.使用的Python版本为3.0.x,解释器为CPython.本系列博客为学习笔记,记录跟随廖老师所学知识,同时会 ...
- 《深入理解Java虚拟机》学习笔记之类加载
之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...
- Python学习笔记【第一篇】:认识python和基础知识
我的笔记里的python代码运行环境都是在pycharm软件中运行,所以不去记录如何配置环境变量呀什么的. python种类 Cpython: Python的官方版本,使用C语言实现,使用最为广泛,C ...
- 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...
随机推荐
- 搜索入门_简单搜索bfs dfs大杂烩
dfs题大杂烩 棋盘问题 POJ - 1321 和经典的八皇后问题一样. 给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...
- [LeetCode&Python] Problem 447. Number of Boomerangs
Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...
- 田螺便利店—PyCharm安装第三方库
PyCharm安装第三方库是十分方便的,无需pip或其他工具,平台就自带了这个功能而且操作十分简便.如下: 1. 打开软件,点击左上角“文件(File)”—>“设置(setting)”: 2. ...
- php基础-2
php的逻辑运算 &&符号 <?php function tarcrnum() { for ($i = 0; $i <= 100; $i++) { if ($i % 2 = ...
- Echarts全解注释
coordinate-geo.js文件为地理坐标系的配置参数 mytextStyle={ color:"#333",//文字颜色 fontStyle:"normal&qu ...
- LeetCode - Daily Temperatures
Given a list of daily temperatures, produce a list that, for each day in the input, tells you how ma ...
- day43 数据库学习egon的博客 索引
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...
- Singer 学习六 运行&&开发taps、targets (一 taps 运行说明)
文章内容来来自官方github 说明: singer大部分的taps && targets 是用python编写的,所以内容里面的代码也是使用python 编写 使用python运行s ...
- skipper prometheus 监控
skipper 是支持prometheus监控的,只是没有启用,需要添加参数 -enable-prometheus-metrics 测试使用的是一个简单nginx web ,同时使用docker-co ...
- Unity API 解析 (陈泉宏著)
1 Application类 2 Camera类 3 GameObject类 4 HideFlags类 5 Mathf类 6 Matrix4x4类 7 Object类 8 Quaternion类 9 ...