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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM