Импорт модулей в Nifi ExecuteScript
Я новичок в нифи и питоне
Я хочу выполнить свой скрипт на Python. Поэтому использовал ExecuteScript и пытался импортировать определенные модули. Я импортировал, как это:
import json, sftp, paramiko
Хотя у меня установлен sftp, когда я импортирую его в Executescript, он говорит: "Не удалось обработать сеанс. Ни один модуль с именем sftp в строке номер 1"
which -a sftp
/usr/bin/sftp
При импорте paramiko также получена та же ошибка.
2 ответа
Механизм "python", используемый ExecuteScript и InvokeScriptedProcessor, на самом деле является Jython, а не чистым Python. Это означает, что он не может загружать собственные модули (файлы.so, скомпилированные файлы C и т. Д.). Согласно этому посту, paramiko использует Crypto с собственными библиотеками, поэтому его нельзя использовать в Jython (см. Нижнюю часть этого поста для моего комментария по этому поводу). Я предполагаю, что библиотека sftp делает то же самое.
Jython может использовать чистые модули Python, в списке рассылки NiFi обсуждается, как указывать (и включать) такие типы модулей.
Процессор ExecuteScript использует собственный Jython Engine для выполнения ваших сценариев Python. Поскольку импортируемые вами библиотеки не доступны в NIFI, встроенная в Jython Engine вызывает ошибку.
РЕШЕНИЕ:
Если python уже установлен на нашем компьютере со всеми этими библиотеками (на том же компьютере, где установлен ваш NIFI), вы можете использовать этот механизм python для выполнения вашего скрипта. Вы можете выполнить свой код на Python, используя процессор ExecuteProcess. см. конфигурацию ExecuteProcess.
Если действительно важно использовать python. Вы можете использовать ExecuteStreamCommand. Он запустит код Python, используя движок Python, установленный на вашем компьютере.
Недостатком является то, что вы не можете получить доступ к атрибутам потокового файла внутри вашего кода Python. Только его содержание.
Чтобы получить доступ к контенту,
import sys
data = sys.stdin.readlines()
и чтобы передать содержимое следующему процессору, просто распечатайте результат.
print("THIS IS MY OUTPUT, IT WILL BE PASSED AS CONTENT TO THE NEXT PROCESSOR")
в противном случае, если вам нужно придерживаться ExecuteScript, используйте groovy, это избавит вас от много головной боли.