今天,给大家介绍下如何在java用jython的方法得到Python数据并把它转换为java下数据类型.下面我们进入正题:
我们使用的jython的jar包版本为2.70,然后在引入jar包jythonutils1.0
例如下面是之前只用jython2.70常用方法:
import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
/**
* 在java中调用本机python脚本中的函数
*
* @author liuyazhuang
*
*/
public class FirstJythonScript {
public static void main(String args[]) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("D:/Workspaces/J2EE/Test/config/my_utils.py");
PyFunction func = (PyFunction) interpreter.get("adder", PyFunction.class);
int a = 2010, b = 6;
PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("anwser = " + pyobj.toString());
}
}
但是有个问题我们怎么精确的得到PyObject类包装的Python数据并转换成java数据呢:
先引入测试的test.py文件,我是把它直接放在src下的
#coding='utf-8'
def fun1(*argv):
return {i==argv[0]:i for i in argv}
def fun2(a, b):
return a+b
def fun3(*argv):
return [i for i in argv]
def fun4():
return '你好,jython世界!'
#print('hello jython!')
先看个引入jythonutils1.0后的简单例子:
1.
@Test
public void fun5() throws Exception{//.py文件执行
JythonUtils.execPyFile("src/text.py");
}
2.
@Test
public void fun4() throws Exception{//python的string转java的string
PyObject object = JythonUtils.execPyFunction("src/text.py", "fun4");
String str= (String)JythonUtils.toObjectFromPyObject(object);
System.out.println(JythonUtils.encoding(str));
}
执行结果:
你好,jython世界!
3.
@Test
public void fun3() throws Exception{//python的list转java的list
List l = new ArrayList();
l.add(1);
l.add("100");
PyObject object = JythonUtils.execPyFunction("src/text.py", "fun3",1,2,"hello!",l);
List list= (List)JythonUtils.toObjectFromPyObject(object);
System.out.println(list);
System.out.println(list.get(2));
System.out.println(((List)list.get(3)).get(1));
}
执行结果:
[1, 2, 'hello!', [1, '100']]
hello!
100
4.
@Test
public void fun2() throws Exception{//python的int转java的int
PyObject object = JythonUtils.execPyFunction("src/text.py", "fun2",1,2);
int n= (Integer)JythonUtils.toObjectFromPyObject(object);
System.out.println(n);
}
执行结果:
3
5.
@Test
public void fun1() throws Exception{//python的dict转java的map
PyObject object = JythonUtils.execPyFunction("src/text.py", "fun1",1,"haha");
Map map= (Map)JythonUtils.toObjectFromPyObject(object);
System.out.println(map);
System.out.println(map.get(true));
}
执行结果:
{False: 'haha', True: 1}
1
注:这里我执行的都是用Junit的@Test方式
在这里jythonutils包装了一些简单的操作
像只执行.py文件的话执行
JythonUtils.execPyFile("文件名")
执行.py中的方法
PyObject object = JythonUtils.execPyFunction("文件名", "函数名",参数1,参数2,,...);//这里是可变参数
Object o = JythonUtils.toObjectFromPyObject(object);
将o强转为自己需要的java数据类型以Map为例:
Map map= (Map) o;
若在转String类型碰到中文乱码情况可以尝试使用:
String str= (String)JythonUtils.toObjectFromPyObject(object);
JythonUtils.encoding(str);
jython2.7jar包下载链接http://download.csdn.net/detail/l1028386804/9464731
jythonutils1.0包下载链接http://download.csdn.net/detail/zq18239961260/9848466
jython2.70常用方法链接:http://m.blog.csdn.net/article/details?id=50915556