在Nifi ExecuteScript中导入模块

时间:2016-11-21 11:49:25

标签: apache-nifi

我是Nifi和python的新手

我想执行我的python脚本。所以使用了ExecuteScript并尝试导入某些模块。我这样导入了:

import json, sftp, paramiko

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

which -a sftp
/usr/bin/sftp

当导入paramiko时,也会出现同样的错误。

3 个答案:

答案 0 :(得分:12)

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

Jython可以使用纯Python模块,this post关于如何指向(并包含)这些模块。

答案 1 :(得分:1)

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

解决方案:

如果python已经安装在我们的机器上,包含所有这些库(安装了NIFI的机器),你可以使用该python引擎来执行你的脚本。你可以使用ExecuteProcess处理器执行你的python代码。 see the configuration of ExecuteProcess.

答案 2 :(得分:0)

如果使用python确实很重要。您可以使用ExecuteStreamCommand。它将使用您计算机上安装的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,这将为您节省很多麻烦。