Устанавливаем Python на Android

[:ru]Python Logo

Столкнувшись с ограничениями встроенного в Android интерпретатора Bash, я стал искать альтернативу, которая позволила бы автоматизировать подключение и авторизацию телефона в публичных Wi-Fi сетях. После недолгих поисков был выбран язык программирования Python, поскольку программы на его основе не нуждаются в компиляции. В этой статье я опишу процесс установки Python на Android смартфон.

Установка интерпретатора Python на Android

Python на AndroidДля работы был выбран QPython (внимание, не QPython3!), который доступен для установки из магазина приложений Google Play. Такой выбор обусловлен наличием встроенной в QPython консоли, а также удобного редактора с подсветкой синтаксиса и моментальной отладкой кода.

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

Запуск интерпретатора без приложения

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

Чтобы запуск интерпретатора Python стал возможен без приложения, необходимо написать небольшой скрипт, который настроит окружение специально для Python. QPython был выбран как раз потому, что он уже содержит данный скрипт.

В итоге, скрипт запуска интерпретатора py.sh будет выглядеть так:

#!/system/bin/sh
. /data/data/com.hipipal.qpyplus/files/bin/init.sh
python-android5 "$@"

В данном случае запускается бинарный файл python-android5, предназначенный для Android 5, в котором добавили проверку исполняемых файлов. Данный способ может заработать на более старых версиях Android, однако будет лучше заменить python-android5 на python.

Данный скрипт можно разместить где угодно (даже на карте памяти), а запускается он следующим образом:

> sh py.sh

Python 2.7.2 (default, Oct 25 2014, 20:52:15)
[GCC 4.9 20140827 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

А чтобы запустить готовый скрипт, нужно передать путь к нему через аргументы:

> sh py.sh test.py

Python is cool!

ВНИМАНИЕ! Для запуска интерпретатора при помощи этого скрипта необходимы права root!

Удобный запуск Python из терминала

Чтобы не нужно было постоянно писать путь к скрипту запуска интерпретатора, можно сделать так, чтобы он запускался при помощи команды python.

Для этого нужно перенести наш скрипт в директорию /system/xbin (входит в переменную PATH) при помощи следующих команд в эмуляторе терминала:

# Получаем права root
su
# Монтируем системный раздел для записи
mount -o remount,rw /system
# Копируем наш скрипт в /system/xbin
cp /путь/к/скрипту/py.sh /system/xbin/python
# Делаем скрипт исполняемым
busybox chmod +x /system/xbin/python
# Монтируем системный раздел только для чтения
mount -o remount,ro /system

После выполнения этих команд, можно будет запустить интерпретатор Python при помощи следующей команды:

> python

Python 2.7.2 (default, Oct 25 2014, 20:52:15)
[GCC 4.9 20140827 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Установка дополнительных модулей

Стандартные библиотеки не всегда удобны для решения мелких задач, поэтому может потребоваться установка дополнительных библиотек. В нашем случае это сделать очень легко.

В качестве примера установим модуль Python Requests (установку можно совершить без участия компьютера):

  1. Скачаем zipball с модулем по следующей ссылке: https://github.com/kennethreitz/requests/zipball/master
  2. Распакуем полученный архив. Среди распакованных файлов присутствует директория requests, которая содержит необходимый нам модуль.
  3. В случае с QPython, пользовательские модули находятся в директории /sdcard/com.hipipal.qpyplus/lib/python2.7/site-packages/, поэтому скопируем директорию requests туда.

Сразу же после копирования модуля, он становится доступным для использования. Чтобы проверить правильность установки, запустим следующий код в интерпретаторе Python:

import requests
r = requests.get('http://curlmyip.com')
r.status_code

Если сообщений об ошибках нет, то все было сделано правильно.

Автоматизация запуска скриптов

Наконец, получив возможность запускать Python скрипты из терминала, мы можем автоматизировать их запуск. Одним из подходящих для этого приложений является AutomateIt и плагин AutomateIt Shell Plugin, добаляющий поддержку shell-скриптов.

AutomateIt позволяет запускать команды в терминале при срабатывании определенных условий (например, подключение к Wi-Fi). Команда запуска Python скрипта будет выглядеть следующим образом:

python /путь/к/скрипту.py

Заключение

Данный алгоритм был протестирован на OnePlus One с Cyanogen OS 12s, однако он должен работать и с другими устройствами (только пути к файлам могут отличаться). В ходе работы было испробовано множество вариаций интерпретаторов Python, однако только QPython заработал на Android 5. Остальные на данный момент еще не исправлены.

Как обычно, обо всех недочетах и вопросах пишите мне в коммантариях, исправлю и помогу, чем смогу.

Спасибо за внимание! :3[:en]Python Logo

Столкнувшись с ограничениями встроенного в Android интерпретатора Bash, я стал искать альтернативу, которая позволила бы автоматизировать подключение и авторизацию телефона в публичных Wi-Fi сетях. После недолгих поисков был выбран язык программирования Python, поскольку программы на его основе не нуждаются в компиляции. В этой статье я опишу процесс установки Python на Android смартфон.

Установка интерпретатора Python на Android

Python на AndroidДля работы был выбран QPython (внимание, не QPython3!), который доступен для установки из магазина приложений Google Play. Такой выбор обусловлен наличием встроенной в QPython консоли, а также удобного редактора с подсветкой синтаксиса и моментальной отладкой кода.

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

Запуск интерпретатора без приложения

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

Чтобы запуск интерпретатора Python стал возможен без приложения, необходимо написать небольшой скрипт, который настроит окружение специально для Python. QPython был выбран как раз потому, что он уже содержит данный скрипт.

В итоге, скрипт запуска интерпретатора py.sh будет выглядеть так:

#!/system/bin/sh
. /data/data/com.hipipal.qpyplus/files/bin/init.sh
python-android5 "$@"

В данном случае запускается бинарный файл python-android5, предназначенный для Android 5, в котором добавили проверку исполняемых файлов. Данный способ может заработать на более старых версиях Android, однако будет лучше заменить python-android5 на python.

Данный скрипт можно разместить где угодно (даже на карте памяти), а запускается он следующим образом:

> sh py.sh

Python 2.7.2 (default, Oct 25 2014, 20:52:15)
[GCC 4.9 20140827 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

А чтобы запустить готовый скрипт, нужно передать путь к нему через аргументы:

> sh py.sh test.py

Python is cool!

ВНИМАНИЕ! Для запуска интерпретатора при помощи этого скрипта необходимы права root!

Удобный запуск Python из терминала

Чтобы не нужно было постоянно писать путь к скрипту запуска интерпретатора, можно сделать так, чтобы он запускался при помощи команды python.

Для этого нужно перенести наш скрипт в директорию /system/xbin (входит в переменную PATH) при помощи следующих команд в эмуляторе терминала:

# Получаем права root
su
# Монтируем системный раздел для записи
mount -o remount,rw /system
# Копируем наш скрипт в /system/xbin
cp /путь/к/скрипту/py.sh /system/xbin/python
# Делаем скрипт исполняемым
busybox chmod +x /system/xbin/python
# Монтируем системный раздел только для чтения
mount -o remount,ro /system

После выполнения этих команд, можно будет запустить интерпретатор Python при помощи следующей команды:

> python

Python 2.7.2 (default, Oct 25 2014, 20:52:15)
[GCC 4.9 20140827 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Установка дополнительных модулей

Стандартные библиотеки не всегда удобны для решения мелких задач, поэтому может потребоваться установка дополнительных библиотек. В нашем случае это сделать очень легко.

В качестве примера установим модуль Python Requests (установку можно совершить без участия компьютера):

  1. Скачаем zipball с модулем по следующей ссылке: https://github.com/kennethreitz/requests/zipball/master
  2. Распакуем полученный архив. Среди распакованных файлов присутствует директория requests, которая содержит необходимый нам модуль.
  3. В случае с QPython, пользовательские модули находятся в директории /sdcard/com.hipipal.qpyplus/lib/python2.7/site-packages/, поэтому скопируем директорию requests туда.

Сразу же после копирования модуля, он становится доступным для использования. Чтобы проверить правильность установки, запустим следующий код в интерпретаторе Python:

import requests
r = requests.get('http://curlmyip.com')
r.status_code

Если сообщений об ошибках нет, то все было сделано правильно.

Автоматизация запуска скриптов

Наконец, получив возможность запускать Python скрипты из терминала, мы можем автоматизировать их запуск. Одним из подходящих для этого приложений является AutomateIt и плагин AutomateIt Shell Plugin, добаляющий поддержку shell-скриптов.

AutomateIt позволяет запускать команды в терминале при срабатывании определенных условий (например, подключение к Wi-Fi). Команда запуска Python скрипта будет выглядеть следующим образом:

python /путь/к/скрипту.py

Заключение

Данный алгоритм был протестирован на OnePlus One с Cyanogen OS 12s, однако он должен работать и с другими устройствами (теслиолько пути к файлам могут отличаться). В ходе работы было испробовано множество вариаций интерпретаторов Python, однако только QPython заработал на Android 5. Остальные на данный момент еще не исправлены.

Как обычно, обо всех недочетах и вопросах пишите мне в коммантариях, исправлю и помогу, чем смогу.

Спасибо за внимание! :3[:]