zoukankan      html  css  js  c++  java
  • java调用python程序以及向python程序传递参数

    在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python的问题。

    1 一个解决思路是在java项目中引入jython,然后使用python解释器运行jython代码,实例代码如下:

    PythonInterpreter interpreter = new PythonInterpreter();

    interpreter.exec("XXX ");

    XXX代表要运行的jython代码,jython有python的库,但不是特别全,如果python程序引入的库比较多,这种方式可能不能解决问题。

    2 另一种方式就是在java程序中直接调用python程序,这样无论python程序引入什么样的库(模块),只要程序可以直接通过python xxx.py运行,则在Java程序中也能运行。下面重点介绍在Java中直接调用python程序的方法。

    2.1  Python程序代码

    1. import sys  
    2.   
    3. def main(abc):  
    4.     print(abc)  
    5.       
    6. if __name__ == '__main__':  
    7.     for i in range(1, len(sys.argv)):  
    8.         strs = sys.argv[i]  
    9.         main(strs)  

    程序目录名称为D:/pyworkspace/main.py,函数main有参数,参数通过sys传入,也就是在java中定义好参数,然后通过sys,将参数传给main函数,把参数打印出来。

    2.2 Java程序代码

      1.import java.io.BufferedReader;  

    2.import java.io.IOException;  

    3.import java.io.InputStreamReader;  

    4.public class Main {  

    5.  

    6.    public static void main(String[] args) {  

    7.  

    8.        // TODO Auto-generated method stub  

    9.        Process proc;  

    10.        try {  

    11.            String[] args1 = new String[] { "python", "D:\pyworkspace\main.py", "hello,test java and python"};  

    12.            proc=Runtime.getRuntime().exec(args1);  

    13.            //用输入输出流来截取结果  

    14.            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));  

    15.            String line = null;  

    16.            while ((line = in.readLine()) != null) {  

    17.                System.out.println(line);  

    18.            }  

    19.            in.close();  

    20.            proc.waitFor();  

    21.        } catch (IOException e) {  

    22.            e.printStackTrace();  

    23.        } catch (InterruptedException e) {  

    24.            e.printStackTrace();  

    25.        }  

    26.  

    27.    }  

    28.} 

    可以看到核心代码就是

      String[] args1 = new String[] { "python", "D:\pyworkspace\main.py", "hello,test java and python"};  

           proc=Runtime.getRuntime().exec(args1);  

    Runtime.getRuntime().exec()的参数是一个字符串数组,相当于执行

    python D:/pyworkspace/main.py,

    往main.py中传递参数"hello,test java and python"。

    2.3 运行结果

     

    3 一些注意的问题

    3.1 要保证在命令行模式下,键入命令

    python D:/pyworkspace/main.py

    程序可以正常运行。也就是要保证有一个配置好的python环境。这个示例程序比较简单,如果是一个比较复杂的python项目,可能涉及到的模块比较多,用到的库也很多,需要将python环境配置完整,先在命令行下运行,无误后再在java程序中调用。

    3.2 java中的核心代码,Runtime.getRuntime().exec(),如果python的入口函数不需要参数的话,可以直接将调用py文件的字符写入,示例

    Runtime.getRuntime().exec(“python”,” D:\pyworkspace\main.py”)

    4 参考资料

    https://www.cnblogs.com/bethansy/p/7614749.html

    https://blog.csdn.net/quliuwuyiz/article/details/79366897

    https://www.cnblogs.com/mingforyou/p/3551199.html

     

  • 相关阅读:
    网站常见的反爬虫和应对方法 + [评论]
    斯坦福大学自然语言处理第一课——引言(Introduction)
    爬虫入门实战,知乎小爬虫
    使用情感分析技术做营销
    字符串匹配的KMP算法
    向Array中添加希尔排序
    向Array中添加二分插入排序
    向Array中添加插入排序
    开辟我的前端之旅!
    【apache】yum 安装Apache(Centos 6.5)
  • 原文地址:https://www.cnblogs.com/coodream2009/p/9989010.html
Copyright © 2011-2022 走看看