場景: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正常執行且可以正常接收到返回值。
總結
print
與 return
的區別
print
:當你在 Python 程式碼中使用 print
時,它將輸出內容到標準輸出流(stdout)。在 Kettle 中,標準輸出可以被捕獲並顯示在日誌或結果中。因此,透過 print
輸出的內容可以被 Kettle 讀取並顯示。
return
:return
語句用於從函式中返回值。當你在 Kettle 中呼叫 Python 程式碼時,返回的值(如果沒有直接被列印)不會自動被捕獲或傳遞迴 Kettle 的上下文。因此,return
的值不會出現在 Kettle 的輸出中。
另外使用java程式碼步驟也可以呼叫python且接收返回值,小夥伴們可以自己嘗試下。
小夥伴們若還有其他比較好的方案,歡迎評論區留言。