Apache nifi 在Nifi ExecuteScript中导入模块

Apache nifi 在Nifi ExecuteScript中导入模块,apache-nifi,Apache Nifi,我不熟悉Nifi和python 我想执行我的python脚本。因此,使用ExecuteScript并尝试导入某些模块。我是这样进口的: import json, sftp, paramiko 虽然我已经安装了sftp,但当我在Executescript中导入它时,它显示“无法处理会话。第1行没有名为sftp的模块” 导入paramiko时也会出现相同的错误。ExecuteScript和InvokeScriptedProcessor使用的“python”引擎实际上是Jython,而不是纯pyth

我不熟悉Nifi和python

我想执行我的python脚本。因此,使用ExecuteScript并尝试导入某些模块。我是这样进口的:

import json, sftp, paramiko
虽然我已经安装了sftp,但当我在Executescript中导入它时,它显示“无法处理会话。第1行没有名为sftp的模块”

导入paramiko时也会出现相同的错误。

ExecuteScript和InvokeScriptedProcessor使用的“python”引擎实际上是Jython,而不是纯python。这意味着它无法加载本机模块(.so文件、编译的C文件等)。根据,paramiko使用Crypto,Crypto具有本机库,因此不能在Jython中使用(请参阅的底部以了解我对此的评论)。我猜sftp库也会这样做


Jython可以使用纯Python模块,这里介绍了如何指向(并包括)这些类型的模块。

ExecuteScript处理器使用自己的Jython引擎来执行Python脚本。由于您要导入的库在NIFI inbuild Jython引擎中不可用,因此抛出错误

解决方案:


如果我们的机器上已经安装了python以及所有这些库(与安装NIFI的机器相同),那么您可以使用该python引擎来执行脚本。您可以使用ExecuteProcess处理器执行python代码

如果使用python真的很重要的话。您可以使用executestream命令。它将使用机器上安装的python引擎运行python代码

缺点是不能在python代码中访问flowfile的属性。只有它的内容

要访问内容

import sys
data = sys.stdin.readlines()
要将内容传递给下一个处理器,只需打印输出

print("THIS IS MY OUTPUT, IT WILL BE PASSED AS CONTENT TO THE NEXT PROCESSOR")

否则,如果您需要坚持使用ExecuteScript,请使用groovy,这将为您省去很多麻烦

如何设置“Module Directory”属性,以便ExecuteScript使用
pip
-已安装的模块?将其设置为Python安装下的
站点软件包
目录
print("THIS IS MY OUTPUT, IT WILL BE PASSED AS CONTENT TO THE NEXT PROCESSOR")