MOJO — Интеграция с Python

MOJO — Интеграция с Python - полезная возможность.

Пламенный привет посетителям этой страницы, пришедшим из социальных сетей, да и всем остальным тоже!

В апреле 2021-го года наблюдал удивительное явление: обильный поток посетителей из 4-х социальных сетей. В связи с этим настоятельно рекомендую всем неоднократно и регулярно посещать сайт rtbsm.ru — там в общих чертах изложена Российская Теннисная Балльная Система Марии (Шараповой).

Приглашаю всех полюбоваться на Фото и Видео красавицы Марии — надеюсь, что Вы поделитесь адресом сайта rtbsm.ru с друзьями и знакомыми.

Главная проблема — известить Марию, чтобы она лично как можно скорее заявила на весь мир о РТБСМ.

MOJO — Интеграция с Python позволяет, как я с восторгом понял, не заниматься переделкой текстов отлаженных Python программ, а включать их в MOJO программы.

Привожу информацию со страницы https://docs.modular.com/mojo/manual/python/ :

Интеграция с Python

Наша долгосрочная цель — сделать Mojo надмножеством Python (то есть сделать Mojo совместимым с существующими программами на Python). Программисты на Python должны иметь возможность использовать Mojo немедленно и иметь доступ к огромной экосистеме пакетов Python, доступных сегодня.

Однако Mojo всё ещё находится на ранней стадии разработки, и многие функции Python ещё не реализованы. В настоящее время Вы не можете написать в Mojo всё, что Вы можете написать на Python. А у Mojo пока нет собственной экосистемы пакетов.

Чтобы помочь преодолеть этот пробел, Mojo позволяет импортировать модули Python, вызывать функции Python и взаимодействовать с объектами Python из кода Mojo. Он запускает код Python с использованием стандартного интерпретатора Python (CPython), поэтому Ваш существующий код Python изменять не нужно.

Импорт модуля Python

Чтобы импортировать модуль Python в Mojo, просто вызовите Python.import_module() с именем модуля:

from python import Python
fn use_array() raises:
# This is equivalent to Python's `import numpy as np`
var np = Python.import_module("numpy")
# Now use numpy as if writing in Python
var array = np.array([1,2,3])
print(array)

use_array()

[1 2 3]
Да, это импортирует Python NumPy, и Вы можете импортировать любой другой модуль Python, который Вы установили.

Несколько моментов, на которые следует обратить внимание:

  • В настоящее время Вы не можете импортировать отдельные элементы (например, отдельный класс или функцию Python) — Вы должны импортировать весь модуль Python, а затем получить доступ к элементам через имя модуля.
  • Mojo пока не поддерживает код верхнего уровня, поэтому import_module() вызов должен выполняться внутри другого метода. Это означает, что Вам может потребоваться импортировать модуль несколько раз или передавать ссылку на модуль. Это работает так же, как с Python: многократный импорт модуля не приведет к запуску логики инициализации более одного раза, поэтому Вы не заплатите за снижение производительности.
  • import_module() может возникнуть исключение (например, если модуль не установлен). Если Вы используете его внутри fn функции, Вам нужно либо обрабатывать ошибки (используя try/except предложение), либо добавить raises ключевое слово в сигнатуру функции. Вы также увидите это при вызове функций Python, которые могут вызывать исключения. (Создание исключений гораздо чаще встречается в коде Python, чем в стандартной библиотеке Mojo, что ограничивает их использование по соображениям производительности.)

ПРИМЕЧАНИЕ

Mojo загружает интерпретатор Python и модули Python во время выполнения, поэтому, где бы Вы ни запускали программу Mojo, она должна иметь доступ к совместимому интерпретатору Python и находить любые импортированные модули Python. Для получения дополнительной информации см. в разделе Среда Python - (https://docs.modular.com/mojo/manual/python/#python-environment)

Импортируйте локальный модуль Python

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

Например, предположим, что у Вас есть файл Python с именем mypython.py:

mypython.py

import numpy as np
def gen_random_values(size, base):
# generate a size x size array of random numbers between base and base+1
random_array = np.random.rand(size, size)
return random_array + base

Вот как Вы можете импортировать его и использовать в файле Mojo:

main.mojo
from python import Python
fn main() raises:
    Python.add_to_path("path/to/module")
var mypython = Python.import_module("mypython")
var values = mypython.gen_random_values(2,3)
print(values)
С ними работают как абсолютные, так и относительные пути. add_to_path(). Например, Вы можете выполнить импорт из локального каталога следующим образом:
Python.add_to_path(".")

Вызовите Mojo из Python

Как показано выше, Вы можете вызывать модули Python из Mojo. Однако в настоящее время нет способа выполнить обратный импорт модулей Mojo из Python или вызвать функции Mojo из Python.

Это может представлять проблему при использовании определенных модулей. Например, многие фреймворки пользовательского интерфейса имеют основной цикл событий, который выполняет обратные вызовы к определяемому пользователем коду в ответ на события пользовательского интерфейса. Иногда это называют шаблоном «инверсии управления». Вместо того, чтобы код Вашего приложения вызывал in к библиотеке, код фреймворка вызывает out к коду Вашего приложения.

Этот шаблон не работает, потому что Вы не можете передавать обратные вызовы Mojo модулю Python.

Для примера рассмотрим популярный пакет Tkinter. Типичное использование Tkinter примерно такое:

  • Вы создаете главное, или «корневое», окно для приложения.
  • Вы добавляете в окно один или несколько виджетов пользовательского интерфейса. Виджеты могут иметь связанные функции обратного вызова (например, при нажатии кнопки).
  • Вы вызываете метод mainloop() корневого окна, который прослушивает события, обновляет пользовательский интерфейс и вызывает функции обратного вызова. Основной цикл продолжается до завершения работы приложения.

Поскольку Python не может выполнять обратный вызов в Mojo, одной из альтернатив является использование приложения Mojo для запуска цикла событий и опроса обновлений. В следующем примере используется Tkinter, но базовый подход может быть применен к другим пакетам.

Сначала мы создаем модуль Python, который определяет интерфейс Tkinter с окном и одной кнопкой:

%%python
import tkinter as tk
classApp:
def__init__(self):
self._root = tk.Tk()
self.clicked =False
defclick(self):
self.clicked =True
defcreate_button(self, button_text:str):
        button = tk.Button(
            master=self._root,
            text=button_text,
            command=self.click
)
        button.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
defcreate(self, res:str):
self._root.geometry(res)
self.create_button("Hello Mojo!")
defupdate(self):
self._root.update()

Мы можем вызвать этот модуль из Mojo следующим образом:

from python import Python
fnbutton_clicked():
print("Hi from a Mojo fn!")
defmain():
    Python.add_to_path(".")
var app = Python.import_module("myapp").App()
    app.create("800x600")
whileTrue:
        app.update()
if app.clicked:
            button_clicked()
            app.clicked =False

Вместо модуля Python, вызывающего метод Tkinter mainloop(), Mojo код вызывает update() метод в цикле и проверяет clickedатрибут после каждого обновления.

Среда Python

Mojo SDK зависит от существующей установленной версии Python, которая включает версию интерпретатора Python с общей библиотекой. Когда Вы устанавливаете Mojo SDK, он пытается найти совместимую версию интерпретатора Python и настроить Python sys.path для загрузки соответствующих модулей. В большинстве случаев это просто работает, и вам не нужно выполнять какую-либо дальнейшую настройку Вашей среды Python.

Если Вы столкнетесь с проблемами после установки Mojo, ознакомьтесь со следующими разделами.

Проблемы с установкой

При запуске программы установки она пытается найти разделяемую библиотеку CPython с помощью модуля find_libpython.

Это может привести к сбою, если верно одно из следующих значений:

  • Не установлена версия Python, или установленная версия не поддерживается Mojo SDK.
  • Программа установки не может найти версию интерпретатора CPython с общей библиотекой (например, .so или .dylib file). Некоторые дистрибутивы Python не включают разделяемые библиотеки, что не позволяет Mojo встраивать интерпретатор.

В этом случае вам необходимо установить совместимую версию Python, которая включает разделяемые библиотеки. Попробуйте следовать инструкциям в Настройка среды Python с помощью Conda, чтобы установить виртуальную среду.

Настройка среды Python с помощью Conda

Использование виртуальной среды Python, такой как Conda, является одним из способов избежать проблем с Вашей установкой Python. Это обеспечивает согласованную среду Python с известной версией Python и всеми пакетами Python, которые Вы хотите использовать с Mojo.

Как настроить виртуальную среду с помощью Conda:

  1. Установите Conda, следуя быстрым инструкциям по установке из командной строки.Обязательно инициализируйте Conda для оболочки или оболочек, которые Вы используете, например:
    ~/miniconda3/bin/conda init zsh
    

    Или:

    ~/miniconda3/bin/conda init --all
    
  2. Перезапустите свою оболочку.
  3. Выполните следующую команду, чтобы настроить Mojo на использование общей библиотеки Python из Вашей среды Conda:
    exportMOJO_PYTHON_LIBRARY="$(find $CONDA_PREFIX/lib -iname'libpython*.[s,d]*'|sort-r|head-n1)"
    echo"export MOJO_PYTHON_LIBRARY=$MOJO_PYTHON_LIBRARY">> ~/.zshrc
    

    Если Вы используете оболочку, отличную от zsh, вам нужно будет настроить эти команды . Например, если Вы используете bash, замените .zshrc на используемый вами файл конфигурации оболочки, такой как .bashrc или .bash_profile.

  4. Попробуйте запустить Mojo REPL:
    mojo
    

После настройки виртуальной среды Conda Вы можете установить любой Python пакеты, которые Вы хотите использовать с Mojo, используя команду conda install. Для примера:

conda install numpy

Для получения дополнительной информации об использовании Conda с Mojo см. Использование Mojo с Pythonв блоге Modular.

Функция печати в формате Python не поддерживается в Mojo #539

!…

Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В особо хороших комментариях сохраняю ссылку на сайт автора!

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
MOJO - Интеграция с PythonПродолжение тут…

Deviz_11

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.