美文网首页
在Java中调用Python

在Java中调用Python

作者: __元昊__ | 来源:发表于2019-09-26 08:50 被阅读0次

写在前面

在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。

直接通过Runtime进行调用

我们知道,在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class InvokeByRuntime {

    public static void main(String[] args) throws Exception {
        String exe = "python";
        String command = "E:\\my_projects\\py_lyh1\\java_run_python_test.py";
        String num1 = "10";
        String num2 = "20";
        String[] cmdArr = new String[] {exe, command, num1, num2};
        Process process = Runtime.getRuntime().exec(cmdArr);
        InputStream is = process.getInputStream();
        BufferedReader bufferedReader  = new BufferedReader(new InputStreamReader(is));
        String count;
        while((count = bufferedReader.readLine()) != null){
            System.out.println(count);
        }
        bufferedReader.close();

        process.waitFor();
    }
}

java_run_python_test.py:

# coding=utf-8
from sys import argv

num1 = argv[1]
num2 = argv[2]
sum_num = int(num1) + int(num2)
print(sum_num)
print('第一个参数:{0} 第二个参数:{1}'.format(num1, num2))

显然,在Java中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果。需要注意的是,不能在Python中通过return语句返回结果,只能将返回值写入到标准输出流中,然后在Java中通过标准输入流读取Python的输出值。

总结

虽然在Java中调用Python可以有多种方式解决,甚至因为Jython的出现更显得非常便利。但是这种程序间嵌套调用的方式不可取,首先抛开调用性能不说,增加了耦合复杂度。更加有效的方式应该是通过RCP或者RESTful接口进行解耦,这样各司其职,也便于扩展,良好的架构是一个项目能够健康发展的基础。在微服务架构大行其道的今天,这种程序间嵌套调用的方式将会逐渐被淘汰。

相关文章

网友评论

      本文标题:在Java中调用Python

      本文链接:https://www.haomeiwen.com/subject/jwrqyctx.html