欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现调用jython执行python文件的方法

程序员文章站 2023-01-03 17:09:28
本文实例讲述了java实现调用jython执行python文件的方法。分享给大家供大家参考,具体如下: 在web开发时候,经常在web环境使用本地环境的第三方库什么的,本...

本文实例讲述了java实现调用jython执行python文件的方法。分享给大家供大家参考,具体如下:

在web开发时候,经常在web环境使用本地环境的第三方库什么的,本文讲解java如何执行python文件。

网上说方法有三种,其实也就两种,下面着中介绍第二种通过(jython)。

方法一

java.lang.runtime
  runtime rt = runtime.getruntime();
    try {
        process proc = rt.exec("python /tmp/test.py");
    }catch (exception e){
      e.printstacktrace();
    }

小计一下:

1、runtime.getruntime()可以取得当前jvm的运行时环境,这也是在java中唯一一个得到运行时环境的方法。

2、runtime上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用到getruntime方法。

3、runtime中的exit方法是退出当前jvm的方法,估计也是唯一的一个吧,因为我看到system类中的exit实际上也是通过调用runtime.exit()来退出jvm的,这里说明一下java对runtime返回值的一般规则(后边也提到了),0代表正常退出,非0代表异常中止,这只是java的规则,在各个操作系统中总会发生一些小的混淆。

第二种(重点)

调用jython api

第一步:添加依赖

<!-- https://mvnrepository.com/artifact/org.python/jython -->
  <dependency>
   <groupid>org.python</groupid>
   <artifactid>jython</artifactid>
   <version>2.7.0</version>
  </dependency>

第二步:新建一个test.java测试类

import org.python.util.pythoninterpreter;
import java.util.properties;
/**
 * author: 遇见小星
 * email: tengxing7452@163.com
 * date: 17-3-21
 * time: 下午8:18
 * describe: jpython test
 */
public class test {
  public static void main(string []args){
    pythoninterpreter interpreter = new pythoninterpreter();
    interpreter.exec("days=('mod','tue','wed','thu','fri','sat','sun'); ");
    interpreter.exec("print days[1];");
    interpreter.execfile("/tmp/test.py");
    interpreter.exec("print 'created by tengxing on 2017.3'");
  }
}

第三步:运行test.java

testing started at 下午9:40 ...
tue
this is test.py
created by tengxing on 2017.3!

进程已结束,退出代码0

提醒可能报如下异常:

exception in thread "main" importerror: cannot import site module and its dependencies: no module named site
determine if the following attributes are correct:

原因:没有初始化 python.import.site

解决:

public class test {
  public static void main(string []args){
    properties props = new properties();
    props.put("python.home", "path to the lib folder");
    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]);
    pythoninterpreter interpreter = new pythoninterpreter();
    interpreter.exec("days=('mod','tue','wed','thu','fri','sat','sun'); ");
    interpreter.exec("print days[1];");
    interpreter.execfile("/tmp/test.py");
    interpreter.exec("print 'created by tengxing on 2017.3!'");
  }
}

ok 完美

//调用python中的方法,并且打印结果
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());

参考文章:

附:jython.jar点击此处。

更多java相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。