开发者社区> jclian91> 正文

Java之调用Python代码

简介:   对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是Python了。对于软件开发者而言,Java又是极其重要的工具。那么,一个很自然的问题就是,我们能够在Java中调用Python代码吗?   想要在Java中调用Python代码,有以下两个办法: 直接通过Runtime进行调用 调用Jython 在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法,粒度更加粗糙,效率较高,需要安装Python软件。
+关注继续查看

  对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是Python了。对于软件开发者而言,Java又是极其重要的工具。那么,一个很自然的问题就是,我们能够在Java中调用Python代码吗?
  想要在Java中调用Python代码,有以下两个办法:

  • 直接通过Runtime进行调用
  • 调用Jython

在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法,粒度更加粗糙,效率较高,需要安装Python软件。而Jython是Python语言在Java平台的实现,可以理解为一个由 Java 语言编写的 Python 解释器,因此,不需要安装Python软件。它不仅提供了Python的库,同时也提供了所有的Java类,这就使得其有一个巨大的资源库。Jython可以直接调用Python程序中的指定函数或者对象方法,粒度更加精细。但遗憾的是,Jython运行速度并不理想。
  接下来,我们将分别介绍以上两种调用方法。
  首先是直接通过Runtime调用Python代码。先写个Python代码文件test_argv.py,它位于D盘中,其完整代码如下:

import sys

a = sys.argv[1]

b = sys.argv[2]

print("%s * %s = %s"%(a,b,int(a)*int(b)))

该Python代码接受两个命令行参数,然后输出一个乘法算式。调用的Java代码如下:

package javaCode;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

public class TestPython {

    public static void main(String[] args) throws Exception {

        Scanner input = new Scanner(System.in);

        // 在同一行输入两个数字,用空格分开,作为传入Python代码的命令行参数
        System.out.println("Enter two integers(e.g. 12 34): ");
        String integers = input.nextLine();
        String[] numbers = integers.split(" ");

        // 定义传入Python脚本的命令行参数,将参数放入字符串数组里
        String cmds = String.format("python D://test_argv.py %s %s", 
                                    numbers[0], numbers[1]);

        // 执行CMD命令
        System.out.println("\nExecuting python script file now.");
        Process pcs = Runtime.getRuntime().exec(cmds);
        pcs.waitFor();

        // 定义Python脚本的返回值
        String result = null;
        // 获取CMD的返回流
        BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());
        // 字符流转换字节流
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        // 这里也可以输出文本日志

        String lineStr = null;
        while ((lineStr = br.readLine()) != null) {
            result = lineStr;
        }
        // 关闭输入流
        br.close();
        in.close();

        System.out.println(result);

    }
}

从以上代码中,可以发现,我们往Python代码中传入了两个命令行参数(两个整数),通过Java提供的Runtime环境让Python执行程序,最后用Java得到在CMD或shell中的输出流并在Java程序输出,本质上还是Python在处理计算结果。其输出如下图所示:


程序输出结果

  然后我们将演示如何使用Jython来实现类似上述程序的功能。
  Jython的MVN仓库地址为http://mvnrepository.com/artifact/org.python/jython/2.7.1b3, API官方网址为: http://www.jython.org/javadoc/, jar的下载地址为: http://www.jython.org/downloads.html . 下载jython-standalone-2.7.0.jar包,并将其加入到Eclipse的Java Build Path中,如下图:


Java Build Path中加入jython-standalone-2.7.0.jar

Java代码如下:

package javaCode;

import org.python.util.PythonInterpreter;

public class TestPython {
    public static void main(String args[]) {
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.exec("import sys ");
        interpreter.exec("a = input('Enter a:')");
        interpreter.exec("b = input('Enter b:')");
        interpreter.exec("print('%s * %s = %s' %(a, b, a*b))");
    }
}

运行以上程序,结果如下图:


运行结果

  至此,我们成功地用以上两种方法在Java中调用了Python代码。
  本次分享到此结束,欢迎大家交流~~

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python:jpype模块调用Java函数
Python:jpype模块调用Java函数
22 0
历届真题 小朋友崇拜圈【第九届】【省赛】【C组】——【C++】【C】【Java】【Python】四种语言解法
历届真题 小朋友崇拜圈【第九届】【省赛】【C组】——【C++】【C】【Java】【Python】四种语言解法
40 0
蓝桥杯官网 试题 PREV-106 历届真题 修改数组【第十届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
蓝桥杯官网 试题 PREV-106 历届真题 修改数组【第十届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
50 0
蓝桥杯官网 试题 PREV-278 历届真题 双向排序【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
蓝桥杯官网 试题 PREV-278 历届真题 双向排序【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
76 0
蓝桥杯官网 试题 PREV-281 历届真题 时间显示【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
蓝桥杯官网 试题 PREV-281 历届真题 时间显示【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
63 0
蓝桥杯官网 试题 PREV-284 历届真题 杨辉三角形【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
蓝桥杯官网 试题 PREV-284 历届真题 杨辉三角形【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法
212 0
浅谈C、Java与Python之间的小差异
C、Java、Python之间的小差异。变量是容器还是标签?Python的for循环为什么不一样?Python为什么不能用i++自增?C语言为什么比较快?Java的JVM是干什么的?C、Java、Python有什么区别,又有什么相似点。..................
37 0
一文速学-Python联通调用JAVA的桥梁PyJnius库详解
一文速学-Python联通调用JAVA的桥梁PyJnius库详解
109 0
2022 技术趋势报告:C++ 重新“受宠”| “data”、“Python”、“Java”上榜热搜词 | 安全话题备受关注
2022 技术趋势报告:C++ 重新“受宠”| “data”、“Python”、“Java”上榜热搜词 | 安全话题备受关注
106 0
+关注
jclian91
热爱算法,热爱技术,热爱生活,期待更好的自己与明天~
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
给运维工程师的Python实战课
立即下载
Python 脚本速查手册
立即下载
ACE 区域技术发展峰会:Flink Python Table API入门及实践
立即下载