场景: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且接收返回值,小伙伴们可以自己尝试下。
小伙伴们若还有其他比较好的方案,欢迎评论区留言。
标签:__,return,python,第八十三,kettle,print,main From: https://www.cnblogs.com/zjBoy/p/18338729