java运行python脚本_JAVA直接调用Python代码

使用场景:

由于前同事有部分代码是用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调用的方式,这样非常灵活

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值