使用场景:
由于前同事有部分代码是用PYTHON写的,现在用JAVA再重构,但是发现其中有一部分逻辑比较复杂,短时间无法重构完,且这个模块相对比较独立,为了尽快上线,我选择这个模块还是用PYTHON不变,在JAVA里面直接调用PYTHON,当然性能不会好。
什么是 Jython
Jython (官网http://www.jython.org)是一种完整的语言,而不是一个简单的 Java 翻译器或 Python 编译器,它是 Python 在 Java 中的完整实现。由于 Jython 继承了 Java 和 Python 二者的特性从而使其显得很独特。
看到这里读者一定会问,那 Jython,Java 以及 Python 之间的关系到底是怎么样的呢?其实,我理解 Jython 说简单一些,就是用 Java 语言实现的 Python 解释器,这种关系也就意味着你可以用 Python 语言编写程序而同时使用 Java 库。
jar包引入
1.maven方式
org.python
jython-standalone
2.7.0
2.官网下载:http://www.jython.org/downloads.html,选择Download Jython 2.7.0 - Standalone Jar : For embedding Jython in Java applications,引入到工程
Python源码
本示例中使用到的Python源码:
1.input.py
print 'hello'
number=[3,5,2,0,6]
print number
number.sort()
print number
number.append(0)
print number
print number.count(0)
print number.index(5)
2.my_utils.py
def adder(a, b):
return a + b
jython测试类
import org.junit.Before;
import org.junit.Test;
import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
public class JavaExecutePython {
public PythonInterpreter interpreter ;
public String basePath = JavaExecutePython.class.getResource("").getPath();
@Before
public void start(){
interpreter = new PythonInterpreter();
}
//在java类中直接执行python语句
@Test
public void test01() {
interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
interpreter.exec("print days[1];");
}
//在java中调用本机python脚本中的函数
@Test
public void test02(){
interpreter.execfile(basePath+"my_utils.py");
PyFunction func = (PyFunction) interpreter.get("adder",PyFunction.class);
int a = 2010, b = 2;
PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("anwser = " + pyobj.toString());
}
//直接执行Python脚本
@Test
public void test03(){
interpreter.execfile(basePath+"input.py");
}
//利用process类执行,如果执行的python脚本有引用第三方包的,建议使用此种方式。
@Test
public void test03(){
Process proc = Runtime.getRuntime().exec("python input.py"); //注意修改路径
proc.waitFor();
}
}
注:上面大部分整理自mengfeiyang
错误一:
console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0.
在用jython在eclipse中开发的时候,控制台的输出可能会出现
console: Failed to install ”: java.nio.charset.UnsupportedCharsetException: cp0.
如果控制台的错误堆栈中有中文的时候,中文就会显示为乱码,解决办法为在要执行的代码上右键,
Run As>Run Configurations,选择第二个页签Arguments,在VM arguments中添加
-Dpython.console.encoding=UTF-8
错误二:
Exception in thread "main" java.lang.IllegalArgumentException: Cannot create PyString with non-byte value
这个错误目前还没有找到解决方法
参考:
基于 Jython 的大型应用系统动态实现
https://www.ibm.com/developerworks/cn/java/j-lo-jythonconfig/
java调用python方法的库jython介绍及使用实例
https://my.oschina.net/u/2391658/blog/710227
总结:如果Python脚本足够简单,依赖足够少,用这个方式可以,反之,建议采用rpc调用的方式,这样非常灵活