kettle從入門到精通 第八十三課 ETL之kettle kettle呼叫python且接收返回值

慕容尘轩發表於2024-08-04

場景:kettle呼叫python執行指令碼,處理之後,再把結果資料流發給下一個步驟。

看到有個qq群裡有個小夥伴求助要實現kettle呼叫python指令碼,然後接收python指令碼執行的結果,最後將結果傳遞到下一個步驟。之前的課程裡面介紹的是kettle透過shell步驟呼叫python指令碼,沒有接收python返回的結果。今天一起來探索下如何接收python返回的結果。開幹!!!

1、編寫python demo程式碼,名字為test2.py

注意:這裡的返回值是透過print 進行輸出,不是return

# -*- coding: utf-8 -*-

import sys

def main():
    if len(sys.argv) < 2:
        print("Usage: python script_with_args.py <arg1>")
        return
    
    arg1 = sys.argv[1]
    print(f"Argument passed from shell: {arg1}")

if __name__ == "__main__":
    main()

2、將步驟【生成記錄】、【JavaScript程式碼】、【寫日誌】拖到畫布中並連線,如下圖所示:

3、透過JavaScript程式碼呼叫test2.py檔案,執行環境需要安裝python哦,如下圖所示:

JavaScript程式碼如下:

//Script here

var pythonScriptPath = "D:\\king\\kettle-demo\\test2.py";
var command = "py " + pythonScriptPath+" xiaojingang";

var process = java.lang.Runtime.getRuntime().exec(command);
var reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream()));
var line;
var result = "";

while ((line = reader.readLine()) !== null) {
    result += line;
}

process.waitFor();

4、儲存&執行,javascript正常執行且接收到返回值。

5、將print程式碼調整為return,檔案為test3.py,測試下是否可以正常執行

# -*- coding: utf-8 -*-

import sys

def main():
    if len(sys.argv) < 2:
        return "Usage: python script_with_args.py <arg1>"
    
    arg1 = sys.argv[1]
    return f"Argument passed from shell: {arg1}"

if __name__ == "__main__":
    main()

6、儲存&執行,javascript正常執行但無法接收到返回值,如下圖所示:

7、繼續改造test3.py,在__main__中將main()的執行結果print出來,程式碼如下:

# -*- coding: utf-8 -*-

import sys

def main():
    if len(sys.argv) < 2:
        return "Usage: python script_with_args.py <arg1>"
    
    arg1 = sys.argv[1]
    return f"Argument passed from shell: {arg1}"

if __name__ == "__main__":
    result= main()
    print(result)

儲存&執行,javascript正常執行且可以正常接收到返回值。

總結

printreturn 的區別

print:當你在 Python 程式碼中使用 print 時,它將輸出內容到標準輸出流(stdout)。在 Kettle 中,標準輸出可以被捕獲並顯示在日誌或結果中。因此,透過 print 輸出的內容可以被 Kettle 讀取並顯示。

returnreturn 語句用於從函式中返回值。當你在 Kettle 中呼叫 Python 程式碼時,返回的值(如果沒有直接被列印)不會自動被捕獲或傳遞迴 Kettle 的上下文。因此,return 的值不會出現在 Kettle 的輸出中。

另外使用java程式碼步驟也可以呼叫python且接收返回值,小夥伴們可以自己嘗試下。

小夥伴們若還有其他比較好的方案,歡迎評論區留言。

相關文章