Содержание статьи
Сначала посмотрим на сам Pyto, а потом смастерим простенький веб‑интерфейс, который поможет более удобно скачивать видео через youtube-dl. Работать он будет локально на iOS.
Pythonista
Pyto — не первая попытка создать среду разработки на Python для портативных устройств Apple. Уже много лет существует приложение Pythonista. Оно служило мне верой и правдой, позволяя как решать на ходу сиюминутные задачи (что‑то посчитать, расшифровать, сгенерировать последовательность), так и создавать небольшие полезные приложения. В Pythonista есть свой графический интерфейс и некоторые возможности для взаимодействия с системой. К примеру, можно сделать периодически обновляемый виджет для экрана Today.
Однако разработка Pythonista остановилась уже больше пяти лет назад. Автор за это время появился на публике всего один раз и выпустил небольшой апдейт, который позволил приложению запускаться на современных версиях iOS. А затем снова пропал: ни ответов на форуме, ни постов в твиттере. И уж конечно, никаких новых фич в Pythonista.
Встречайте — Pyto!
И тут на сцену выходит Pyto — тоже творение единственного разработчика, но зато полного сил и энтузиазма. А также, кажется, желания испытывать терпение модераторов Apple, постоянно идя по краю дозволенного в App Store. Pyto, к примеру, умеет запускать приложения в фоне, позволяет создавать локальные веб‑серверы и даже имеет встроенную поддержку репозитория PyPI — ставить пакеты можно буквально одной кнопкой!
info
Установка приложений внутри приложения до сих пор была абсолютным табу в iOS. Любые лазейки в Apple прикрывали, из‑за чего в ту же Pythonista новые пакеты приходилось протаскивать сложной цепочкой действий. Не исключено, что автору Pyto повезло и модераторы просто проморгали нарушения. Или же разрешать программистам некоторые вольности — это новая политика Apple. Поживем — увидим!
У Pyto большие возможности для работы с математическими функциями — к примеру, пакет NumPy, без которого не обходятся любые мало‑мальски сложные вычисления, установлен по умолчанию. Также в Pyto удобно строить графики и даже пользоваться кое‑какими средствами для машинного обучения. К примеру, мне без труда удалось поставить Gensim и поразвлекаться с разбором текстов.
Как и Pythonista, Pyto стоит денег: после трехдневного пробного периода тебя попросят раскошелиться на 750 рублей за базовую версию и 1400 за расширенную, с набором библиотек, требующих компилцяии. Но необходимость раскошеливаться — не главный недостаток Pyto.
Основной проблемой этого приложения остается невероятная сырость. Настолько мощная, что в болото багов можно провалиться по колено, если не с головой. И я не преувеличиваю: один раз мне удалось заклинить Pyto настолько, что даже перезагрузка не помогала.
Однако если держаться проторенных дорожек и пользоваться Pyto бережно и аккуратно, то он сослужит отличную службу.
Особенности Pyto
Командная строка
В Pyto есть командная строка. Но учти, что это не Bash и внутри — не Linux. Это свой командный интерпретатор Pyto. Он поддерживает несколько основных команд Bash — список можно узнать командой help
. Отсюда ты запустишь скрипты на Python, но на установку каких‑то других программ рассчитывать не приходится.
Использование файловой системы
Важное отличие iOS от других операционок — в том, насколько сильно здесь контролируется доступ к файловой системе. Без разрешения скрипт в Pyto не может получить доступ ни к одной папке!
Хорошая новость заключается в том, что запрашивать права очень просто. Для этого в Pyto есть модуль file_system.
Пишем простенький скрипт:
import file_system as fspath = fs.FolderBookmark()print(path)
После его запуска появится диалоговое окно для выбора папки. Выбрав ее, ты дашь Pyto права на доступ ко всем файлам в ней. Именно Pyto, а не своему скрипту! Это означает, что дальше доступ к этой папке будет открыт всем программам внутри Pyto, в том числе после любых перезапусков и перезагрузок.
Если же по ходу исполнения скрипта тебе понадобится получать доступ к разным файлам или папкам, ты можешь воспользоваться функциями import_file(
и open_directory(
из того же модуля. Каждый раз при их вызове будет появляться диалоговое окно для выбора файла или папки.
Запуск фоновых задач
Еще одна особенность iOS — неиспользуемые приложения принудительно завершаются и выгружаются из памяти (если встретишь людей, кропотливо чистящих историю задач в iOS, передай им, что это мартышкин труд — ОС сама отлично с этим справится). Но что сделать, чтобы программа работала в фоне непрерывно? Для разных типов задач в iOS существуют API, все же позволяющие фоновое исполнение.
В Pyto используется нехитрый прием: если тебе нужна работа в фоне, то приложение будет делать вид, что проигрывает аудиофайл, тогда как никакого воспроизведения в реальности не происходит. Для активации этого поведения используй модуль background.
Чтобы программа начала лучше держаться на плаву, достаточно написать что‑то в таком духе:
import background as bgwith bg.BackgroundTask() as task: # Код для исполнения в фоне
Другие фичи и модули
В Pyto есть поддержка еще нескольких интересных возможностей: например, ты можешь активировать свои скрипты вызовами из Shortcuts или URL-схему и передавать им параметры. Другая мощная вещь — мост между Python и Objective-C на основе библиотеки Rubicon-ObjC, он позволяет вызывать функции из нативных фреймворков.
К Pyto прилагается неплохой набор модулей, для работы которых требуется компиляция. Самостоятельно добавлять такие модули, к сожалению, нельзя.
А также несколько собственных модулей для работы с iOS. Мы уже рассмотрели file_system и background, но есть и другие:
- apps — интерфейсы к популярным сторонним приложениям. Позволяют из скрипта активировать другую программу и сказать ей сделать то или иное действие;
- pyto_ui — фреймворк для разработки приложений с графическим интерфейсом. Позволяет рисовать окошки, кнопочки и прочие элементы управления;
- widgets и watch — библиотеки для создания виджетов для экрана «Сегодня» и часов Apple Watch;
- sound, music и speech отвечают за воспроизведение звука, музыки и синтез речи;
- notifications позволяет отправлять оповещения;
- location и motion дают возможность получать геокоординаты устройства и опрашивать датчики движения;
- pasteboard — взаимодействие с буфером обмена;
- multipeer — позволяет обмениваться данными в режиме точка — точка.
Разбор всех этих замечательных возможностей не уместится в одну статью, так что выберем одну небольшую задачу, на которой испытаем Pyto в деле.
Пишем веб-сервер
Задача
Проглядывая доступные в Pyto модули, я заприметил youtube-dl — широко известную утилиту для скачивания видео с видеохостингов. В том числе и тех, которые пытаются защитить контент от подобных действий. В общем, отличная штука! Но пользоваться модулем Python или утилитой для командной строки на мобильном устройстве не очень‑то удобно.
Есть множество способов приделать с помощью Pyto более удобный интерфейс к youtube-dl, в том числе написать графическое приложение на одном из доступных GUI-фреймворков. Однако мне пришла в голову мысль попробовать использовать Pyto в качестве локального веб‑сервера. Заодно можно будет посмотреть, как тут дела с веб‑разработкой.
Инструментарий
Первым делом нам потребуется веб‑фреймворк или как минимум библиотека, которая будет упрощать работу с HTTP. В документации мне встретилось упоминание Tornado и Django, но для нашей задачи и то и то — оверкилл. Достаточно будет Flask, который без проблем установился командой pip
и заработал.
Чтобы еще сильнее упростить себе жизнь, я буду использовать клиентский фреймворк HTMX, который позволяет делать асинхронные запросы без использования JavaScript. С ним достаточно задать тегу несколько HTML-атрибутов с информацией о том, куда слать запрос и куда подставлять полученный ответ. Остальное HTMX сделает сам.
Ну и чтобы внешний вид программы был не колхозным, подключим минималистичный CSS-фреймворк Pico.css.
Код
Первым делом импортируем все необходимое.
import flaskfrom youtube_dl import YoutubeDLfrom threading import Threadimport sysimport urllib.requestimport osimport background as bgimport file_system as fs
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»