Работа с Python
Общие сведения
Python — это высокоуровневый, интерпретируемый язык программирования общего назначения. В этой статье мы рассмотрим использование Python в рамках платформы Engee, а именно:
-
Интеграция Python через пакет PyCall.jl — пишите код на Python в скриптах Engee благодаря пакету PyCall;
-
Особенности при работе с интерактивными скриптами Engee — узнайте особенности работы со скриптами Engee и установите нужные пакеты Python;
-
Работа с переменными Python в среде Engee — работайте с переменными Python в скриптах Engee;
-
Запуск ноутбуков Python в Engee — запускайте собственные ноутбуки Python, перенося их в Engee прямо из внешней среды разработки;
-
Нейронные сети Python и их интеграция с моделями Engee — создавайте и обучайте нейронные сети с библиотеками 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 по типу |
Вы также можете использовать другие команды вызова 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:
Переменные типа PyObject не могут быть экспортированы в формат .mat, но могут в .jld2 (подробнее см. здесь:
Переменные 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 можно по ссылке.