java呼叫python程式
2020-12-30
在做專案的時候,經常會碰到這個問題,主要程式是用java寫的,有些功能使用python寫的,整個專案需要把java程式碼和python程式碼進行整合,在一個專案裡面執行,這就涉及到java呼叫python的問題。
java呼叫python程式有幾種思路:需要先搭建好 java 及 python 的編譯執行環境。
1.一個解決思路是在java專案中引入jython,然後使用python直譯器執行jython程式碼
2.在java程式中直接呼叫python程式,這樣無論python程式引入什麼樣的庫(模組),只要程式可以直接通過python xxx.py執行,則在Java程式中也能執行。下面重點介紹在Java中直接呼叫python程式的方法。
3.通過python釋出網址,java請求的方式呼叫。會佔用網路資源。
4.可能還有其他方法
1.一個解決思路是在java專案中引入jython
然後使用python直譯器執行jython程式碼
2.在java程式中直接呼叫python程式
這樣無論python程式引入什麼樣的庫(模組),只要程式可以直接通過python xxx.py執行,則在Java程式中也能執行。下面重點介紹在Java中直接呼叫python程式的方法。
2.1 java中的核心程式碼,Runtime.getRuntime().exec(),
Runtime.getRuntime().exec(“python”,” D:\\pyworkspace\\main.py”)
2.2需要注意的一些問題,要保證在命令列模式下,鍵入命令
python D:/pyworkspace/main.py
程式可以正常執行。也就是要保證有一個配置好的python環境。這個示例程式比較簡單,如果是一個比較複雜的python專案,可能涉及到的模組比較多,用到的庫也很多,需要將python環境配置完整,先在命令列下執行,無誤後再在java程式中呼叫。
2.3示例
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)Java程式程式碼
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Process proc; try { String[] args1 = new String[] { "python", "D:\\pyworkspace\\main.py", "hello,test java and python"}; proc=Runtime.getRuntime().exec(args1); //用輸入輸出流來擷取結果 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line = null; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); proc.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
可以看到核心程式碼就是
String[]args1=newString[]{"python","D:\\pyworkspace\\main.py","hello,testjavaandpython"};
proc=Runtime.getRuntime().exec(args1);
Runtime.getRuntime().exec()的引數是一個字串陣列,相當於執行
python D:/pyworkspace/main.py,
往main.py中傳遞引數"hello,testjavaandpython"。
3)執行結果
4.