Python

Описание

Узел создает новый набор данных с заданным составом и параметрами полей и заполняет его данными в ходе выполнения кода Python. Для заполнения выходного набора в коде возможно использование данных входных портов.

Состав и параметры полей выходного набора могут задаваться как в мастере настройки узла, так и из кода Python.

Примечание: Для работы узлов Python может потребоваться предварительная настройка Loginom и установка Python. Подробности в разделе Параметры компонента: Python.

Вход

  • Входной источник данных (таблица данных), необязательный;
  • Добавить еще один порт – создает новый порт Входной источник данных[N], где N – порядковый номер порта;
  • Входные переменные (переменные), необязательный.

Выход

  • Выходной набор данных (таблица данных).

Мастер настройки

Последовательно выполняются следующие этапы настройки:

  • Настройка столбцов Выходной таблицы Python;
  • Python – ввод кода и предварительный просмотр результатов.

Настройка столбцов выходной таблицы

Столбцы выходного набора можно задать как на странице Настройка столбцов выходной таблицы Python мастера, так и динамически, в ходе исполнения кода Python. При установке флага Разрешить формировать выходные столбцы из кода доступно динамическое создание, изменение и удаление выходных столбцов.

Python

Страница Python содержит редактор исполняемого узлом кода. Запускать написанный скрипт возможно внутри процесса Loginom или в отдельном процессе (в Процессе интерпретатора) при установке флага Запускать в отдельном процессе.

При запуске исполняемого кода в Loginom есть возможность по кнопке Предпросмотр… выводить до 100 первых строк результирующего набора данных и панель вывода сообщений в отдельном окне.

Примечание: При нажатии на кнопку Предпросмотра активируются все входные порты. При успешном завершении активации открывается окно Предпросмотра.

При запуске скрипта на Python внутри процесса Loginom одновременно может выполняться только один узел Python, соответственно последующий в очереди запуска узел Python ожидает выполнения предыдущего. Максимальное время ожидания задается параметром Тайм-аут ожидания запуска (мс). По умолчанию тайм-аут неограничен. Если время тайм-аута превышено, выполнение узла завершается с соответствующей ошибкой.

При запуске исполняемого кода на Python в отдельном процессе может выполняться сразу несколько узлов Python параллельно, соответственно Тайм-аут ожидания запуска (мс) не поддерживается.

Примечание: под Linux не поддерживается режим выполнения Python внутри процесса Loginom, следовательно, нет и настройки Путь библиотеки. Узлы Python, настроенные на выполнение внутри процесса, на Linux будут выполняться в отдельном процессе.

Поддерживается импорт модулей Python (см. Параметры компонента: Python).

См. также: Горячие клавиши редактора кода

Доступ из кода Python к данным портов и другим встроенным объектам

Для доступа к данным портов и другим встроенным объектам в контексте выполнения кода предусмотрены следующие объекты:

Вышеуказанные объекты импортируются из встроенного модуля "builtin_data". По умолчанию в текст исполняемого узлом кода добавляется строка импорта этих объектов.

Обработка ошибок

При вызове окна Предпросмотра или выполнении узла выводится сообщение об обнаруженных синтаксических ошибках и ошибках хода выполнения с указанием позиции кода, содержащего ошибку.

Особенности использования и ограничения

  • Минимальная поддерживаемая версия Python — 3.5.
  • Максимальная протестированная версия Python — 3.10.
  • Python из дистрибутива Anaconda не поддерживается.
  • Не поддерживаются модули пакета multiprocessing.
  • Создание GUI-интерфейса из кода Python не является целевым назначением компонента Python и в некоторых случаях может приводить к неверной работе приложения. Например:
    • работа узла не будет прекращена до завершения работы GUI-приложения. При работе в серверных редакциях Loginom пользователь, как правило, не имеет доступа к окну GUI-приложения.
    • для работы matplotlib с бэкэндом Qt и в целом с PyQt требуется наличие файла qt.conf с путями к библиотекам/плагинам Qt. При невозможности их найти, приложение Loginom будет принудительно завершено с сообщением об ошибке.
  • Оставленные незавершенными фоновые потоки могут приводить к аварийному завершению приложения.
  • В случае критических ошибок python3x.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)


Статьи в разделе: