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

 

posted @ 2018-11-20 15:03  cooldream2009  阅读(10096)  评论(4编辑  收藏  举报