• Java之调用Python代码 转载:https://mp.weixin.qq.com/s/cr8dXzwsQhtei9TfXwcMcA


    对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是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(" Executing 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代码

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    Linux的压缩和解压命令
    RabbitMQ消费消息的两种模式:推和拉
    没有开启keepalive,接收消息会超时
    不止背锅!互联网大厂的运维都在干什么?30K的总监来告诉你
    tcp 开启keepalive
  • 原文地址:https://www.cnblogs.com/testzcy/p/13356738.html
Copyright © 2020-2023  润新知