在做項目的時候,經常會碰到這個問題,主要程序是用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程序代碼
- import sys
- def main(abc):
- print(abc)
- if __name__ == '__main__':
- for i in range(1, len(sys.argv)):
- strs = sys.argv[i]
- 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