美文网首页
在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