1. 程式人生 > 實用技巧 >java呼叫python程式

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程式的方法。

java通過Runtime類呼叫python命令執行。

3.通過python釋出網址,java請求的方式呼叫。會佔用網路資源。

4.可能還有其他方法

1.一個解決思路是在java專案中引入jython

然後使用python直譯器執行jython程式碼

參考:java呼叫python的幾種用法(看這篇就夠了)

2.在java程式中直接呼叫python程式

這樣無論python程式引入什麼樣的庫(模組),只要程式可以直接通過python xxx.py執行,則在Java程式中也能執行。下面重點介紹在Java中直接呼叫python程式的方法。

2.1 java中的核心程式碼,Runtime.getRuntime().exec(),

如果python的入口函式不需要引數的話,可以直接將呼叫py檔案的字元寫入,示例

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.