Документация Engee

Работа с Python

Общие сведения

Python — это высокоуровневый, интерпретируемый язык программирования общего назначения. В этой статье мы рассмотрим использование Python в рамках платформы Engee, а именно:

Вызов Python в Engee

Интеграция Python через пакет PyCall.jl

PyCall.jl — это пакет Julia, который позволяет вызывать функции и объекты из Python напрямую в коде Julia. Он обеспечивает интерфейс между Julia и Python и дает возможность импортировать модули Python, вызывать их функции, создавать объекты и писать с ними код в Julia. Подробнее о поддерживаемых командах вызова, литералах и пакетах Python в Julia читайте в статье PyCall.jl.

PyCall по умолчанию встроен в Engee, вам не требуется устанавливать или импортировать его.

В Engee используется вычислительное ядро Julia, но вы можете писать код на Python в скриптах Engee с помощью следующих способов:

  • Оборачивание кода на Python строковым литералом py"""…​""", основанном на пакете PyCall. Данный литерал выполняет строку в качестве программного кода Python, не возвращая значения и выполняя переданный код.

  • Оборачивание кода на Python строковым литералом py"…​", основанном на PyCall. Данный литерал принимает строку в качестве аргумента и выполняет ее как выражение Python.

  • Использование команд pyimport, pyeval, pycall, @pycall, pybuiltin, @pywith, @pyinclude, @pysym, @pydef.

Рассмотрим эти способы на примерах.

Вы можете писать код на Julia с помощью привычного синтаксиса Python. Для этого оберните ваш код на языке Python литералами py"""…​""" и py"…​", например:

py""" # оборачивает в литерал
import numpy as np # импортирует пакет numpy
"""
a = py"np.zeros(2)" # оборачивает в литерал, в котором создает одномерный массив из двух элементов, заполненный нулями

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

np = pyimport("numpy")
a = np.zeros(2)

В обоих примерах переменные a будут иметь одинаковое значение. Разница между примерами в том, что в случае с командой pyimport в Julia появляется объект np, к которому можно обращаться напрямую.

В Julia команды Python по типу import numpy as np не работают нативно, но с помощью строковых литералов вы можете вставлять код на Python прямо в код Julia при условии установленного пакета PyCall.

Вы также можете использовать другие команды вызова Python в Julia:

  • pyimport — импортирует модуль Python в Julia, позволяя использовать его функции и переменные в коде Julia.

  • pyeval — выполняет строковый код Python в контексте Julia, возвращая результат выполнения.

  • pycall — вызывает функцию Python с указанными аргументами из Julia.

  • @pycall — макрос, который предоставляет удобный синтаксис для вызова функций Python из Julia. Обычно используется чаще чем pycall из-за более простого вызова.

  • pybuiltin — предоставляет доступ к встроенным функциям Python, таким как print, len, range, и т.д.

  • @pywith — макрос создает контекст выполнения Python, в котором можно работать с блоками кода Python внутри Julia.

  • @pyinclude — макрос, который включает файл с кодом Python в Julia и выполняет его.

  • @pysym — макрос, который преобразует имя символа Julia в соответствующий объект Python.

  • @pydef — создает класс Python, методы которого реализуются в Julia.

Например, команда pybuiltin:

pybuiltin("print")("Hello, world!")

Код выводит сообщение Hello, world!.

Особенности при работе с интерактивными скриптами Engee

Ознакомьтесь с примером использования Python в скриптах Engee:

Ознакомиться с примером использования Python в скриптах Engee можно здесь.

Интерактивные скрипты Engee (с расширением .ngscript) представляют собой инструмент для работы с кодом в среде Engee (см. подробнее здесь). Рассмотрим особенности работы с интерактивными скриптами Engee для Python:

  • Скрипты Engee можно создать непосредственно в самом Engee. Это единственный поддерживаемый формат для создания интерактивных скриптов.

  • Добавление пакетов в одном скрипте Engee позволяет использовать их в других скриптах Engee без повторной установки.

  • Скрипты Engee поддерживают магические команды Python, например %run.

Для работы с Python в скриптах Engee вам может понадобиться множество пакетов, например, пакет поддержки научных расчетов SciPy. Для его установки используйте менеджер пакетов Pkg и синтаксис Julia:

using Pkg
Pkg.add("SciPy") # установит пакет SciPy в Julia

Для удаления пакетов используйте команду rm. Например, Pkg.rm("Pluto"). Подробнее читайте здесь.

Для того чтобы узнать какие пакеты установлены в скриптах Engee, используйте:

import Pkg
Pkg.status()

Рассмотрим пример. Для этого установим пакет SciPy и используем его для нахождения корня уравнения через строковый литерал py""":

py"""
from scipy.optimize import root_scalar

def func(x):
    return x**2 - 4

result = root_scalar(func, method='brentq', bracket=[0, 2])

print("Результат (корень уравнения):", result.root)
"""

Разберем код подробнее:

  • В строке from scipy.optimize import root_scalar импортируется функция root_scalar из модуля scipy.optimize. Эта функция предназначена для численного нахождения корней уравнений у одной переменной.

  • В строке def func(x): определяется функция func, для которой ищется корень. Через return значение уравнения возвращается функции func, а x – переменная.

  • В строке result = root_scalar(func, method='brentq', bracket=[0, 2]) функция root_scalar используется для поиска корня уравнения, заданного функцией func. Метод 'brentq' указывает, что мы хотим использовать именно метод Брэнта. Через параметр bracket=[0, 2] задаем интервал поиска корня уравнения (в нашем случе от 0 до 2).

  • В строке print("Результат (корень уравнения):", result.root) выводится найденный корень уравнения. result.root содержит значение корня, найденное функцией root_scalar.

В итоге мы находим корень уравнения с помощью метода Брента из пакета SciPy. Будет получено значение корня уравнения:

Результат (корень уравнения): 2.0

Аналогичным образом вы можете использовать другие пакеты Python вроде NumPy, Matplotlib, Pandas и т.д., но учитывайте, что в Engee нельзя создать разные среды Python и переключаться между ними.

Единственным ограничением по объему устанавливаемых пакетов является память RAM, которая выделена под ваш текущий сеанс в Engee. Подробнее о доступной памяти читайте здесь.

Работа с переменными Python в среде Engee

Переменные, созданные в ноутбуках Python или в скриптах Engee с помощью вызова Python — будут иметь тип PyObject. Такая типизация переменных вызвана тем, что типы данных в Python неравнозначны Julia и для сохранения данных переменным Python присваивается свой уникальный тип.

Вы можете импортировать переменные из модуля Python в переменные Julia вызывая методы напрямую. Например:

math = pyimport("math")
math.sin(math.pi / 4)

В результате получим значение: 0.7071067811865475.

В этом коде команда math = pyimport("math") используется в Julia с помощью пакета PyCall. Она позволяет импортировать модуль math из стандартного пакета Python и сохранить его в переменной math для дальнейшего использования в коде на Julia:

python straight method 1

Переменные типа PyObject не могут быть экспортированы в формат .mat, но могут в .jld2 (подробнее см. здесь:

python variables 1

Переменные Python не могут быть очищены с помощью встроенных средств Engee, но могут быть перезаписаны. Для удаления переменных требуется перезапуск сессии.

При необходимости переменные PyObject можно использовать дальше в скриптах Engee, но следует помнить, что типы данных Python отличаются от Julia. Если конвертация типов необходима, то рекомендуем приводить типы явно:

var_jl = py"int(var_py)" #var_py — переменная с типом PyObject
println(var_jl)

где var_jl — переменная Julia. После конвертации переменная var_py осталась с типом PyObject, таким образом мы создали новую переменную var_jl в Julia из старой var_py типа PyObject.

Вы можете работать в скриптах Engee с переменными типа PyObject, не задавая их явно. Например, у нас есть переменная deg с типом PyObject. Мы можем обратиться к ней через команду println(deg), и, например, прибавить 10:

println(deg + 10)

# получим PyObject 11.

Переменная сохранила свой тип PyObject и мы успешно осуществили математическую операцию.

Запуск ноутбуков Python в Engee

Вы можете загрузить в Engee свой ноутбук Python (Jupyter Notebook), и запускать его в редакторе скриптов. Рассмотрим особенности работы с ноутбуками Python:

  • Ноутбуки Python нельзя создать в Engee, поэтому экспортируйте их из внешнего программного обеспечения в файловый браузер Engee.

  • Установленные в скриптах Engee пакеты не могут быть импортированы в ноутбуки Python. Нужные пакеты необходимо установить повторно для каждого нового ноутбука Python.

  • Из ноутбука Python в Engee нельзя обратиться к магическим командам Julia и к двум функциям пользовательского ввода – input() и getpass().

  • Ноутбуки Python не поддерживают задержку в коде (например, через функцию sleep) и выводят результат выполнения кода мгновенно.

  • Нельзя использовать скрипты Python (расширение .py).

  • Нельзя использовать инструмент управления пакетами conda, только pip.

Для установки пакетов в ноутбуки Python используйте магическую команду !pip:

!pip install scipy
Магические команды (magic commands) – специальные команды в различных инструментах для разработки программного обеспечения. Эти команды предназначены для выполнения дополнительных действий, которые могут быть полезны при интерактивном программировании и анализе данных.

При необходимости установите пакеты из файла формата WHL:

!pip install path/to/file.whl

WHL – архивированный формат упаковки и распространения пакетов Python. Для установки WHL файла предварительно перенесите его в файловый браузер Engee. WHL-файлы содержат предварительно скомпилированные бинарные файлы пакетов, что облегчает их установку и управление зависимостями проекта. Вы можете найти файлы формата WHL на официальных сайтах соответствующих пакетов Python.

Для того чтобы узнать какие пакеты установлены в ноутбуках Python, используйте:

!pip list

Ознакомьтесь с примером использования .ipynb в Engee:

Импорт пользовательских модулей

Для того чтобы импортировать свои модули в Python-ноутбуки, нужно убедиться, что путь к ним добавлен в переменную sys.path. По умолчанию эта переменная содержит пути к стандартным библиотекам, установленным пакетам и текущему рабочему каталогу интерпретатора Python, а не к директории, где находится скрипт. Чтобы узнать текущий каталог, можно использовать функцию os.getcwd(). При необходимости текущий каталог можно изменить с помощью os.chdir("path"). Если модуль находится в другом каталоге, его путь нужно добавить в sys.path вручную. Это можно сделать с помощью команды:

import sys
sys.path.append('/path/to/your/module')

После добавления пути в sys.path, модуль можно импортировать и использовать его функции и данные. Если попытаться импортировать модуль из каталога, который не добавлен в sys.path, возникнет ошибка ModuleNotFoundError.

Нейронные сети Python и их интеграция с моделями Engee

Ознакомьтесь с примером для обучения нейронной сети с помощью библиотеки scikit-learn и генерацией данных для обучения из модели:

Для работы с нейронными сетями с помощью Python в Engee используется пакет PyCall и команды вызова Python в Julia. Например, для библиотеки scikit-learn:

# установка библиотеки sklearn в Julia
using Pkg
Pkg.add("ScikitLearn")

# импорт необходимых модулей из Python в Julia
@pyimport sklearn.datasets as datasets
@pyimport sklearn.neural_network as nn
@pyimport numpy as np

Ознакомиться с другим примером обучения нейронной сети в Engee с помощью PyCall можно по ссылке.