Python
Описание
Узел создает новый набор данных с заданным составом и параметрами полей и заполняет его данными в ходе выполнения кода Python. Для заполнения выходного набора в коде возможно использование данных входных портов.
Состав и параметры полей выходного набора могут задаваться как в мастере настройки узла, так и из кода Python.
Примечание: Для работы узлов Python может потребоваться предварительная настройка Loginom и установка Python. Подробности в разделе Особенности использования и ограничения.
Вход
Входной источник данных (таблица данных), необязательный;
Добавить еще один порт – создает новый порт Входной источник данных[N], где N – порядковый номер порта;
Входные переменные (переменные), необязательный.
Выход
Выходной набор данных (таблица данных).
Мастер настройки
Последовательно выполняются следующие этапы настройки:
- Настройка столбцов выходной таблицы Python;
- Python – ввод кода и предварительный просмотр результатов.
Настройка столбцов выходной таблицы
Столбцы выходного набора можно задать как на странице Настройка столбцов выходной таблицы Python мастера, так и динамически, в ходе исполнения кода Python. При установке флага Разрешить формировать выходные столбцы из кода доступно динамическое создание, изменение и удаление выходных столбцов.
Python
Страница Python содержит редактор исполняемого узлом кода. По кнопке Предпросмотр… в отдельном окне выводятся до 100 первых строк результирующего набора данных и панель вывода сообщений.
Примечание: При нажатии на кнопку Предпросмотра активируются все входные порты. При успешном завершении активации открывается окно Предпросмотра.
Поскольку одновременно может выполняться только один узел Python, то последующий в очереди запуска узел Python ожидает выполнения предыдущего. Максимальное время ожидания задается параметром Тайм-аут ожидания запуска (мс). По умолчанию тайм-аут неограничен. Если время тайм-аута превышено, выполнение узла завершается с соответствующей ошибкой.
Поддерживается импорт модулей Python (см. Особенности использования и ограничения).
См. также: Горячие клавиши редактора кода
Доступ из кода Python к данным портов и другим встроенным объектам
Для доступа к данным портов и другим встроенным объектам в контексте выполнения кода предусмотрены следующие объекты:
- Входные наборы данных (
InputTables
,InputTable
); - Входные переменные (
InputVariables
); - Выходной набор данных (
OutputTable
); - Необходимые перечисления (
DataType
,DataKind
,UsageType
).
Вышеуказанные объекты импортируются из встроенного модуля "builtin_data"
. По умолчанию в текст исполняемого узлом кода добавляется строка импорта этих объектов.
Обработка ошибок
При вызове окна Предпросмотра или выполнении узла выводится сообщение об обнаруженных синтаксических ошибках и ошибках хода выполнения с указанием позиции кода, содержащего ошибку.
Особенности использования и ограничения
- Для работы узлов Python необходимо выполнение следующих условий:
- в системе должен быть установлен Python одной разрядности с сервером Loginom.
- при необходимости разрешить выполнение узлов Python. По умолчанию в серверных редакциях Loginom это запрещено в разделе Администрирование->Параметры->Параметры компонента Python. В настольных редакциях выполнение узлов Python по умолчанию разрешено.
- при необходимости в параметре Путь библиотеки раздела Администрирование->Параметры->Параметры компонента Python указать путь к библиотеке python3x.dll, где x – номер минорной версии. Если в параметре путь не задан, то осуществляется его автоматический поиск в переменной окружения
PYTHONHOME
и реестре. Если в этих расположениях отсутствует путь к библиотеке или необходимо использовать конкретную версию Python из нескольких установленных в системе, то следует указать путь к библиотеке в параметрах компонента Python.
- Минимальная поддерживаемая версия Python - 3.4.
- Максимальная протестированная версия Python - 3.9.
- Python из дистрибутива Anaconda не поддерживается.
- Не поддерживаются модули пакета multiprocessing.
- Создание GUI-интерфейса из кода Python не является целевым назначением и в некоторых случаях может приводить к неверной работе приложения. Например:
- работа узла не будет прекращена до завершения работы GUI-приложения. При работе в серверных версиях Loginom пользователь, как правило, не имеет доступа к окну GUI-приложения.
- для работы
matplotlib
с бэкэндом Qt и в целом с PyQt требуется наличие файла qt.conf с путями к библиотекам/плагинам Qt. При невозможности их найти, приложение Loginom будет принудительно завершено с сообщением об ошибке.
- Оставленные незавершенными фоновые потоки могут приводить к аварийному завершению приложения.
- В случае критических ошибок python3*.dll может аварийно завершить приложение. Рекомендуется использовать предварительно отлаженный код Python.
- Одновременно может выполняться только один узел Python.
- Остановить выполнение узла Python можно только между инструкциями интерпретатора.
- Виртуальные окружения не поддерживаются.
Код узла выполняется в модуле __main__
. Таким образом выполняется условие __name__ == '__main__'
, которое обычно используется для запуска скриптов.
Поддерживается импорт модулей из файлового хранилища. В коде узла:
- Если пакет сохранен, то относительный путь к импортируемому модулю указывается от расположения пакета. sys.path (
sys.path[0]
) содержит путь к директории пакета, в котором находится узел Python. - Если пакет не сохранен, то относительный путь к импортируемому модулю указывается от каталога пользователя. sys.path (
sys.path[0]
) содержит путь к каталогу пользователя.
В модулях относительный путь указывается от расположения модуля, осуществляющего импорт.
Относительно сохраненного пакета Loginom расположены следующие модули:
- модуль
./foo/__init__.py
:
__all__ = ["module"]
from .foo import cube
- модуль
./foo/foo.py
:
def cube(x):
return x * x * x
- модуль
./foo/module/__init__.py
:
from .module import say_hello
- модуль
./foo/module/module.py
:
def say_hello():
return "Hello"
При таком расположении модулей импорт и вызов функций этих модулей может осуществляться в узле Python следующим образом:
from foo import cube
from foo.module import say_hello
print(say_hello())
print("3 ** 3 =", cube(3))
В режиме Предпросмотра результатов значение атрибута __file__
модуля __main__
равно <preview>
, при выполнении узла – <main>
.
from builtin_data import OutputTable
if __file__ == "<preview>":
print(__file__)
else:
OutputTable.Append()
OutputTable.Set(0, __file__) #__file__ == "<main>"
Доступна глобальная функция filestoragepath
, которая принимает путь в файловом хранилище и преобразует его в абсолютный путь в файловой системе. Дополнительных импортов для ее применения выполнять не нужно.
from builtin_data import OutputTable
import json
with open(filestoragepath("data_file.json")) as f:
data = json.load(f)
OutputTable.Append()
OutputTable.Set(0, data)
Статьи в разделе: