这篇笔记主要记录了我使用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. [LeetCode&Python] Problem 748. Shortest Completing Word

    Find the minimum length word from a given dictionary words, which has all the letters from the strin ...

  2. hdoj-1503 (LCS解的输出)

    题目链接 回溯输出解 #include <bits/stdc++.h> using namespace std; ; int dp[N][N],dir[N][N]; char s1[N], ...

  3. P2261 [CQOI2007]余数求和 (数论)

    题目链接:传送门 题目: 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod + k mod + k mod + … + k mod n的值,其中k mod i表示k ...

  4. HPU组队赛L(没有标题。。)(贪心)

    时间限制 1 Second  内存限制  512 Mb 题目描述 给个字符串s和整数k.(字符串中只有0-9) 问至少修改字符串中的几位才可以让字符串的各个位之和大于等于k. 输入 第一行一个整数T表 ...

  5. java中实现Comparable接口实现自定义排序

    class Student implements Comparable{ String name; int gpa; @Override public int compareTo(Object arg ...

  6. 20165313 《Java程序设计》第八周学习总结

    教材学习总结 线程常用方法 1.start() 2.run()定义线程线程对象被调度之后所执行的操作 3.sleep(int millsecond),必须在try-catch语句块中调用sleep方法 ...

  7. 监控页面后退前进,浏览器文档加载事件之pageshow、pagehide

    https://www.cnblogs.com/milo-wjh/p/6811868.html http://www.runoob.com/jsref/event-onpageshow.html on ...

  8. 【JVM】java对象

    一.对象内存布局 对象在内存中存储可分为3块区域:对象头,实例数据,对齐填充 1.对象头 对象头包含两部分内容. 第一部分:存储对象自身的运行时数据,哈希吗(hashCode),GC分代年龄,锁状态标 ...

  9. 【mysql】创建索引

    一.联合唯一索引 项目中需要用到联合唯一索引: 例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,数据库本身也可以设定: 例如:t_aa 表中有aa,bb两个字段,如果不希望有2条 ...

  10. zabbix监控mysql最简单的方法

    该实验基于我的上一篇文章监控第一台主机的基础上 首先,因为水平有限,我选择直接关闭了防火墙和SELinux. 环境: 两台centos7,服务器端IP是192.168.200.128(以下简称主机), ...