kettle从入门到精通 第八十三课 ETL之kettle kettle调用python且接收返回值

场景: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 读取并显示。

returnreturn 语句用于从函数中返回值。当你在 Kettle 中调用 Python 代码时,返回的值(如果没有直接被打印)不会自动被捕获或传递回 Kettle 的上下文。因此,return 的值不会出现在 Kettle 的输出中。

另外使用java代码步骤也可以调用python且接收返回值,小伙伴们可以自己尝试下。

小伙伴们若还有其他比较好的方案,欢迎评论区留言。

 

 

posted @ 2024-08-04 13:31  慕容尘轩  阅读(15)  评论(0编辑  收藏  举报