这篇笔记主要记录了我使用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. Gym .102021 .German Collegiate Programming Contest (GCPC 18) (寒假gym自训第三场)

    B .Battle Royale 题意:给你两个点A,B,以及一个圆S,保证两个点在圆外,且其连线与圆相交,求两点间最短距离. 思路:显然是要分别与圆相切,然后在圆弧想走,直到相交. 那么ans=与圆 ...

  2. 完整的AJAX

    $.ajax({url:"请求路径",data:{"key":前端传入后台处理的数据},type:"post", //请求方式dataTyp ...

  3. Dependency Parsing -13 chapter(Speech and Language Processing)

    https://web.stanford.edu/~jurafsky/slp3/13.pdf constituent-based 基于成分的phrasal constituents and phras ...

  4. 服务器死机 导致 mongo 挂掉

    1.删除mongod.lock和mongodb.log日志文件 2.携带参数重新启动 mongod --dbpath=/var/lib/mongo --port=27017 --fork --logp ...

  5. strchr与sscanf

    strchr(s,',')返回字符串s中从左往右第一个字符's'的指针: sscanf(输入的字符或字符串,“%格式符”,存储值):

  6. centos6安装opencv2

    环境 centos6.5 opencv2.4 python2.6(centos自带的) 下载 opencv可从GitHub下载https://github.com/opencv/opencv/tree ...

  7. 《DSP using MATLAB》Problem 5.24-5.25-5.26

    代码: function y = circonvt(x1,x2,N) %% N-point Circular convolution between x1 and x2: (time domain) ...

  8. namespace关键字学习笔记

    一.namespace简介 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,但是由于现在的程序的规模越来越大,程序的分工越来越细,全局作用域变得越来越 ...

  9. 2D Platformer 学习

    using UnityEngine; using System.Collections; /// <summary> /// 玩家控制 /// </summary> publi ...

  10. Nginx可以做什么?看完这篇你就懂了

    本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得,欢迎留言交流. Nginx能做什么 —— ...