ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る

      2016/09/22

Pythonista 3 for ios 00001

iOS用のアプリは通常、開発アカウントを取得し、Macを使って開発します。

開発アカウントを取得するほどではないが、iOSデバイス上で何かやりたい処理がある、という人はいるでしょう。

あるいは、プログラム好きな人なら率先してiOSデバイス上でプログラミングをしたいと思うのではないでしょうか。

そうしたニーズに存分にこたえることができる、iOSデバイス上で動作する統合開発環境がPythonista 3です。

Pythonista 3 for ios 00019

2016年9月21日に開催されたPyCon JP 2016で @equal_001 さんがPythonistaについて発表されていたのでご紹介。

Python支持者のことをPythonistaといいますが、アプリ名はそこから取ったんでしょうね。

正真正銘のPythonが内蔵されていて、ローカルで動きます。

iOS用のこの手のセルフ開発環境は、せいぜいSandboxの中にファイルが保存できるぐらいで、実用的に使えないものがほとんど。

しかし、Pythonista 3はそうじゃありません。iOSとの連携機能が大変強力なので、実用的なスクリプトを作れます! 何なら、スクリプトをスタンドアローンアプリにしてApp Storeで販売もできます。(App Storeに出すなら、Obj-CかSwiftで作ることをお勧めしますが。理由はiOSの進化・変化への追従が最速でないからです)

iOS上で動作するPythonの統合開発環境Pythonistaがメジャーアップデートされ、新規アプリPythonista 3として発売されました。

Pythonista 3App
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)

今回は、そんなPythonista 3を紹介。

Pythonを使ったことがない方へ

Python logo

Pythonの経験がない人は、Pythonista 3を忌避しようとするかもしれませんが、他言語でこれほどまでにお膳立ての整っているiOS上のセルフ開発環境はありません。

メソッドや制御の構文が非対称(閉じない。開きっぱなし)なのが気持ち悪いかもしれませんが、細かい違いは「python if文」などでググって確認する程度で使えると思うのです。この機会に使ってみませんか?

Pythonistaはアクティブなユーザーを抱えており、コミュニティが活発なので質問する場があります。サンプルも豊富です。Pythonが使えるようになれば、年収が上がる可能性もありますよ(笑)。

iOS史上最も発想力を刺激するアプリ

Pythonista 3の通常価格は1,200円。高いようですが、それだけの価値はあります。

iOS上でのセルフ開発環境は、現時点においてPythonista 3が最良のものです。

Pythonista 3App
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)

なお、旧バージョンであるPythonistaも併売されていますが、上位互換を保つPythonista 3に完全移行予定です。今から旧Pythonistaを買う必要はありません。

Pythonista 3のドキュメントはこちら。

ドキュメントは、Pythonista 3の中からも参照できます。

Pythonista 3 for ios 00020

Pythonista 3を使えば、充実したコーディング補助機能に助けられながら電車の中で片手プログラミングもできてしまいます。iPadにキーボードをつないでバリバリやるスタイルもありでしょう。

Anker® TC930 ウルトラスリムBluetoothキーボードカバー iPad Air用
「Origin」 iPhone6 スライドキーボード  4.7インチ対応 iPhone6 Bluetooth キーボード iPhone6ジャストフィット ワイヤレスキーボード + ケース 一体型 IP6SKB ホワイト

iPad Air 2以降ならスプリットスクリーンにも対応しており、生産的な作業を補助する強力な脇役になります。

日常のPC作業で、ターミナルエミュレータを1枚常に開いているようなタイプの方ならぜひ使ってみてください。

Pythonista 3は素晴らしい。2008年から始まったApp Storeの歴史上、間違いなく最も刺激的なアプリです。その魅力を、あなたならきっと分かってくれるはず。

Pythonista 3とは

Pythonista 3はiOS上でPythonプログラミングを楽しめる統合開発環境。

インタプリタとしてのPython、それを取り囲むライブラリ、スクリプトを編集するエディタ、そして、PythonスクリプトをiOS上でさまざまな形で機能させるための各種機能を内包した統合開発環境です。

Python 2、Python 3両対応

Pythonといえば、バージョン2系と3系が両方並行して使われていますが、Pythonista 3は、Python 3.5.1とPython 2.7.5の両方を搭載。

Pythonista 3 for ios 00022

適宜切り替えたり、どちらかを指定して実行可能です。

  • 初期設定からデフォルトのインタプリタを指定
  • 実行ボタン(▶︎)を長押しして、使用するインタプリタを実行直前に指定
  • スクリプト冒頭のシェバング行「#!python2」「#!python3」で指定
  • 対話型コンソールでは、[2.7]もしくは[3.5]ボタンを押して指定

Pythonista 3 for ios 00021

「Python 2 to 3」というツールも用意され、Python 2用のスクリプトをPython 3に移行することもできるようになっています。

充実した標準添付モジュール

Pythonの標準モジュールはもちろん、必要性を鑑みて追加された人気モジュールが利用でき、一般的なPythonに関する知見をPythonista 3上で活用できます。

DropboxEvernoteモジュールなんかは熱いですね。

ちなみに、標準モジュールのxmlrpclibを使うと、WordPressをいじくり倒すことができます。Pythonistaで編集しているテキストをWordPressにアップロードするスクリプトなどが作れますよ。画像をWordPressにアップロードすることもできます。

  • bs4 — BeautifulSoup 4
  • Bottle — Python Web Framework
  • Dropbox for Python
  • evernote
  • faker
  • feedparser — Universal Feed Parser
  • Markdown
  • markdown2 — A fast and complete implementation of Markdown in Python
  • paramiko
  • pil — Python Imaging Library
  • qrcode — Pure python QR Code generator
  • Requests – HTTP for Humans
  • xmltodict

個人的によく使うのは、ステートフルプログラムによるWebブラウジングが可能なmechanize。ドキュメントには記載がありませんが、Python 2.7側で利用可能です。

ログインすると発行されるCookieがWebブラウジングに必要なページなどにアクセスするときに使います。

Pythonの標準ライブラリでは、グラフ描画のmatplotlibなんかも好きです。

Pythonista 3 for ios 00023

生成した画像は、下記の例ではインタラクティブコンソールに表示しているだけですが、カメラロールに保存するなり、ローカルに保存してどこかにアップロードするなり好きなように扱えます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import matplotlib

X = [1,2,3]
Y = [3,1,4]

plt.bar(X,Y, align="center")
plt.xticks(X, [u'Tokyo',u'Osaka','Fukuoka'])
plt.show()

外部モジュールのインストールも可能

あるものを使うだけではありません。モジュールを後からインストールして使うこともできます。

アプリ内にあるフォルダsite-packagesにはパスが通っており、ここにダウンロードしてきたモジュールをインストールできます。Python 2と3が同居する環境であることに配慮して、site-packages2、site-packages3というフォルダも用意されています。

Pythonistaユーザーが作ったstashというシェルがあるのですが、その上で動作するpipコマンドで外部モジュールを簡単に取り込むこともできます。

関連エントリを書きました。

iOSネイティブのUIを構築して本格的なGUI付きアプリを開発可能

UIデザイナーを内蔵していて、UIを持ったスクリプトを作ることができます。

Pythonista 3 for ios 00017

UIはiOSネイティブのもので、「似た別の何か」ではありません。

GUIで発生したタッチイベントとPythonコードをどう結びつけるか具体例を挙げます。新規作成で「Script with UI」を選択。これで*.pyと*.pyuiファイルの組が作られます。

Pythonista 3 for ios 00026

まずは*.pyuiを開き、ボタンを一つ設置してタップで選択。画面右上の(i)アイコンをタップしてインスペクタを表示。

Pythonista 3 for ios 00028

インスペクタの「Action」の項に、タップイベントと関連付けるスクリプト中のメソッド名を入力。

Pythonista 3 for ios 00029

Pythonスクリプトの方では、先ほど入力したメソッド名のメソッドを定義。押したボタンのインスタンスが渡されてくるので、引数を一つ定義しておきます。

渡されたボタンのインスタンスを使って、ボタンのタイトルを変更するようにしました。

import ui
import console

def button_tapped(sender):
  sender.title = "Baka"
  console.alert("Pushed")

v = ui.load_view()
v.present('sheet')

Pythonista 3 for ios 00031

実行するとウインドウが表示されるので、ボタンを押すとアラートが表示されます。ボタンのタイトルが「Baka」にも変わりました。

Pythonista 3 for ios 00033

このような簡易的な作り方もできますが、自由度は高く、UI部品を自作している人もいます。

能動的なユーザーを多く抱えコミュニティが活発

Pythonistaは2012年に登場。4年の歴史を持つアプリです。自由度とポテンシャルの高さから能動的なユーザーを多く擁し、公式のフォーラムが非常に活発。

いろいろな知見が共有されています。

フォーラムの有志が、成果物を共有しています。

Pythonista 3の基本

Pythonista 3に興味を持つ人に、微に入り細に入りの解説は不要かもしれませんが一応基本操作を紹介。

Pythonスクリプトを作成

ファイルブラウザの左端のアイコンをタップして、ファイルに新規作成のメニューを表示。

ここでは「Empty Script>Documents」を選びます。

Pythonista 3 for ios 00001

Pythonスクリプトを編集

編集領域をタップしてキーボードを表示。カーソル移動は、カスタムキーボードの上で指を左右にスライドさせることでもできます。

Pythonista 3 for ios 00003

以下のスクリプトを入力しました。

import console
 
console.alert("Hello, Pythonista!")

「im」まで入力すると補完候補に「import」が出てくるのでそれを選ぶ、といった感じでPythonista 3の入力支援機能の助けを借りて、ソフトウェアキーボードでもなかなかスピーディーにスクリプトが書けます。

Pythonista 3 for ios 00004

外付けキーボードから操作しているなら、Tabキーで補完できます。Tabはカスタムキーボード左端の「→|」からも入力可能です。

Pythonスクリプトを実行

コードエディタ右上の「▷」アイコンをタップすると、スクリプトの実行。

Pythonista 3 for ios 00016

今回は、Pythonista 3専用のconsoleモジュールのalert()を実行したので、ダイアログが表示されました。

ちなみに、「▷」アイコンを長押しすると、引数指定、編集中のソースコードのスタイルチェック、分析(pyflakes)、テスト実行、インタプリタの一時的な切り替えが選べます。

Pythonista 3 for ios 00034

試しにスタイルチェックを実行してみました。pep8というスタイルチェッカーでチェックができます。import文とスクリプト本文との間に、空白行が1行足りないという警告が出ました。何をチェックするのか、環境設定で個別に指定できます。

Pythonista 3 for ios 00035

よく出来たコードエディタ

コードエディタはシンタックスカラーリングに対応していて、Pythonスクリプトが見やすい。

Pythonista 3 for ios 00005

コード補完機能があるので、タイピング量を減らすことが可能。オブジェクトのメンバを考慮した補完候補が出るようになっています。

スクリプト中のメソッド定義、クラス定義を自動的に検出してアウトラインを作るので、定義間のジャンプが楽です。

Pythonista 3 for ios 00006

外部キーボードにも対応

Commandキーを使ったキーボードショートカットに対応。

  • Command + R – 実行
  • Command + L – アウトラインを表示(カーソルキーの上下とリターンでアウトラインを選択して移動が可能)
  • Command + D – スニペットの挿入
  • Command + J – インタラクティブコンソールの表示/隠す
  • Command + return – エディターにフォーカス
  • Command + F – 検索のトグル
  • Command + G – 次の検索結果の表示
  • Command + Shift + G – 前方の検索結果の表示
  • Command + K – インタラクティブコンソールの出力をクリア

Tabでのインデントはもちろん、Shift+Tabでのアンインデント、オートインデントにも対応。

さらに、好きなようにカスタムキーボードショートカットを組み込むことも可能です。

Pythonと対話できるインタラクティブプロンプト

Pythonistaを構成するファイルブラウザ、コードエディタ、インタラクティブプロンプト。

前二つは既に出てきました。最後の一つ、インタラクティブプロンプトは、その名の通り、対話的にPythonのコードを実行するためのものです。

入力欄は最下段にあり、その上はPythonからの出力を表示する出力欄です。

Pythonista 3 for ios 00007

入力欄にPythonスクリプトを入力したら、returnで実行。コード片を即座に実行できますので、大変便利です。実行履歴は記録され、履歴を呼び出して、再編集の上実行できます。

出力欄には入力欄で実行したスクリプトの返り値がログとなって流れていくほか、print文でスクリプト中から任意に出力することができます。デバッグプリントのコンソールとしての役目もあるわけですね。

出力欄にはテキストのみならず、Imageクラスのshowメソッドで画像を表示できます。

import photos
p = photos.pic_image()
p.show()

Pythonista 3 for ios 00008

PythonistaはPIL(Python Imaging Library)が使えるので、ImageMagick的な画像処理ができます。前出のphotosモジュールでフォトライブラリからピッカービューで画像選択すると、Imageオブジェクトのインスタンスが取れます。フォトライブラリから画像を取ってきてPILで加工、フォトライブラリに書き出すことができます。

import photos
from PIL import ImageFilter
p = photos.pick_image()
p2 = p.filter(ImageFilter.FIND_EDGES())
p2.show()

Pythonista 3 for ios 00025

コードエディタを制御するスクリプトを作成、ユーザー定義アクションとして登録できる

editorモジュールを使うと、Pythonistaのコードエディタのいくつかのプロパティにアクセスでき、メソッドを利用できます。

コードエディタ上のテキスト、選択範囲情報などにアクセスして、Pythonistaを制御するスクリプトを書くことができます。

そのスクリプトをPythonistaのアクションメニューに登録・実行できるようになっています。

コードエディタで編集中に、メニューからアクションを呼び出して使うわけです。

Pythonista 3 for ios 00009

以下のスクリプトのメソッドは、コードエディタで選択中のテキストを返すものです。

import sys
import editor
 
# 日本語処理のためデフォルトエンコーディング設定
sys.setdefaultencoding('utf-8')
 
# Pythonistaのコードエディタ上で選択されたテキストを取得する
def selected_text():
	text = unicode(editor.get_text(), 'utf-8')
	selection = editor.get_selection()
	selected_text = text[selection[0]:selection[1]]
	return selected_text

選択中のテキストを加工して、選択中のテキストと置き換える、などといったアクションが作れます。

PythonistaではPythonスクリプト以外にも、テキストファイル、HTMLファイル、JavaScriptファイルなどをコードエディタで開いて編集できるので、テキストファイルの編集を中心とした作業環境、拡張可能なエディタとして使うこともできます。

スクリプトの様々な起動方法

Pythonista 3で作成したスクリプトは、Pythonista内のファイルブラウザの一覧から実行する以外に、いろいろな方法で起動することができます。

スクリプトの起動に手間がかかることで利便性が低下することを憂慮する必要がありません。

URL Scheme経由の特定スクリプトの起動

Pythonistaで作成したPythonスクリプトは、URL Scheme経由でスクリプト名を指名して問い合わせなしで実行することができます。

例えば、以下のようなURLをSafariや各種ランチャーから起動すると、Test.pyという名前のスクリプトが実行されます。

pythonista3://Test?action=run

URL Scheme経由での起動時に付けた引数を参照することもできます。

pythonista3://Test?action=run&args=foo%20bar

pythonista3://Test?action=run&argv=foo&argv=bar

引数の参照方法などはドキュメントに説明があります。WebブラウザのブックマークレットからPythonista 3を呼び出して連携を取ることも可能です。

x-callback-urlについてはPythonista 3は標準ではサポートしませんが、ユーザーサイドで実装されています。

Home画面からの特定スクリプトの起動

作ったスクリプトをHome画面に設置して、Home画面から直接起動できます。

Pythonista 3 for ios 00010

Touch Icon Generatorと同等のものがPythonista 3から内蔵されました。

Pythonista 3 for ios 00015

通知センターウィジェットからの起動

Pythonista 3には、通知センターウィジェットに関係した機能がありません。

Beta版には通知センターウィジェットを作る機能があったのですが、通知センターウィジェットで使えるメモリーが少ない関係で動作が安定せず、公開版からは削除されてしまいました。

「Launcher – 通知センターウィジェット搭載ランチャー」がPythonistaスクリプトを通知センターウィジェットから起動するためのランチャーとして使えます。登録するURLを「pythonista3://ScriptName?action=run」といったURLにします。

Launcher – 通知センターウィジェット搭載ランチャーApp
カテゴリ: Productivity
販売元: Cromulent Labs, Inc(サイズ: 17.7 MB)
全てのバージョンの評価: (535 件の評価)

notificationモジュールでローカル通知を登録し、通知センターからスクリプトを起動することもできますが、登録した通知をタップするとその1回で消えてしまうので、使い方に工夫を要します。

「Open In…」、共有シートからの起動

iOS標準の共有シートや、「Open In…」からのスクリプト実行が可能です。

TwitterクライアントやWebブラウザからURLを受け取って、テキストエディタからテキストを受け取って、GoodReaderのようなファイラーから任意のファイルを受け取って、カメラアプリから画像を受け取って、Pythonスクリプトで処理が可能なのです。

プログラミングで重要なのは、処理対象です。その点、Pythonista 3は、カメラロール、クリップボード、URL Scheme経由のクエリのやりとり、Open In…、共有シートとアプリケーション連携に必要なiOSの機能に幅広く対応しており、用途は無限大です。

Open In…、共有シートからのデータの取得をするものは「Extension」というカテゴリのスクリプトとなりますが、サンプルが付属しています。動作とスクリプトを見てみます。

公式Twitterの共有シートから「Run Pythonista Script」を選んでみます。

Pythonista 2 0 update 00005

「Copy Photo Location」、「Image Histogram」などアイコンが並んでいますが、これが「Pythonista」上に登録された「Extension」カテゴリのPythonスクリプトです。その上の段のScratchpadは簡易テキストエディタで、この場でスクリプトを書いて実行できます。その隣のConsoleは対話式に1行1行ワンライナーを実行できます。iOSの方々に「Pythonista」が出張していって、iOS全体が開発環境になったかのようです。

公式TwitterクライアントからツイートへのURLが渡されていますので、ここでは、「URL to QR Code」をタップしてみます。

Pythonista 2 0 update 00006

PythonスクリプトでQRコードが生成されて、それが表示されました。

Pythonista 2 0 update 00007

スクリプトの中身を見てみましょう。

qrcodeモジュールとappexモジュールをimport。

appex.get_url() メソッドでURLを取得し、 qrcode.make(url) メソッドで取得したURLからQRコードの画像を生成。それを img.show() でConsoleに表示しています。

# coding: utf-8

import qrcode
import appex

def main():
	if not appex.is_running_extension():
		print 'This script is intended to be run from the sharing extension.'
		return
	url = appex.get_url()
	if not url:
		print 'No input URL found.'
		return
	print url
	img = qrcode.make(url)
	img.show()
	
if __name__ == '__main__':
	main()

これだけのコード量で、立派に機能するExtensionが作れています。

appexモジュールのドキュメントを見ると、さまざまなメソッドが用意されていることが分かります。

Open In…で受け取ったファイルは、 appex.get_attachments() や appex.get_file_path() で保存先のパスが受け取れます。任意のファイルを処理できて、用途が広がります。

以下は、Open In…で受け取ったファイルをPythonista 3の管轄ディレクトリに保存するものです。

# coding: utf-8

import appex, os, console

def save():
    if appex.is_running_extension():
        sFp = appex.get_file_path()
        if sFp:
            console.hud_alert('Saving...')
            with open(sFp, 'rb') as f1:
                with open(os.path.basename(sFp), 'wb') as f2:
                    f2.write(f1.read())
            console.hud_alert('Saved')

if __name__ == '__main__':
    save()

出典: [Share Code] Extension to save attachment

Pythonスクリプトを日用品に仕上げられる実用性の高さ

スクリプトの起動方法のバリエーションの多さからその片鱗を感じていただけているかと思いますが、Pythonista 3の重要な特長に、iOSの機能を自由に使える拡張性の高さ、iOSとの親和性の高さが挙げられます。

その自由度の具体例についてはobjc_utilモジュールのところで解説。

Pythonista 3には、他のアプリとの連携ができるよう、また、iOSの多彩な機能がPythonから利用できるよう、専用モジュールがバンドルされています。

専用モジュールの一覧はこちらにあります。

  • appex(アプリケーション拡張)
    • iOSの共有シートへのアクセス機能を提供
  • canvas(グラフィックス-1)
    • ベクターグラフィックを扱える2D描画機能を提供
  • cb(Bluetooth LE)
    • Bluetooth LE(Bluetooth Smart)機器への接続機能を提供。 Core Bluetoothフレームワークがほぼそのまま使える
  • clipboard(クリップボード)
    • クリップボードの読み書きが可能。画像にも対応
  • console(コンソール)
    • alert、confirm、promptのような基本的な入出力UI、アクティビティインジケータの表示/消去、HUDの表示、QuickLook、Open In…ダイアログ、自動ロック無効化等
  • dialogs(コンソール)
    • consoleモジュールでできるワンライナーのUIより多機能なUI機能を提供。UIデザイナー不要で、コードだけでUIを構築できる
  • contacts(住所録)
    • iOSの住所録の連絡先の読み出し、追加、削除、グループの作成、削除、検索等ほぼフルアクセスを提供
  • editor(エディタ)
    • Pythonistaのコードエディタの制御機能を提供。ファイルの作成、ファイルオープン、選択範囲へのアクセス、作業中のファイルの内容の取得、テーマの適用、行への注釈の適用など
  • keychain(キーチェーン)
    • iOSのKeychainへのアクセスを提供。パスワードを安全に管理できる
  • linguistictagger(自然言語処理)
    • iOSのNSLinguisticTaggerへのアクセスを提供。自然言語の形態素解析
  • location(位置情報)
    • 位置情報へのアクセスを提供、ジオコード、逆ジオコード
  • motion(モーションセンサー)
    • モーションセンサーへのアクセスを提供。重力、加速度、デバイスの向き、磁場の取得
  • notification(プッシュ通知)
    • iOSのローカル通知へのアクセスを提供。ローカル通知の登録、キャンセル
  • objc_util(Objective-C)
    • PythonとObjective-Cをつなぐ言語ブリッジ機能を提供。ここに列挙されているiOSの機能へのアクセスモジュールすべてをこのモジュール一つから作れるほど強力なもの。Objective-C側で定義されているクラスの利用、Objective-C側のクラスの定義、PythonのオブジェクトからObjective-C側のオブジェクトへのキャスト機能など、Pythonista 3の影の主役ともいえる存在。sandboxの制約さえ受けなければ、ほとんど何でもできる。例えばPrivate Frameworkをロードして非公開APIを利用することも可能
  • photos(写真)
    • iOSのカメラ機能、フォトライブラリへのアクセスを提供。Pythonista 3のphotosモジュールは大幅に進化して、Asset、AssetCollectionの機能が網羅された。フォトライブラリへの操作は何でもできる
  • reminders(リマインダー)
    • iOSのリマインダー機能のデータベースのアクセス機能を提供。Calendar、Reminder、Alarmの各オブジェクトを操作
  • scene(グラフィックス-2)
    • ハードウェアアクセラレートが効く2Dグラフィックの描画機能を提供。60fpsで描画が可能。画像のロード、プロパティの始点と終点の値を指定して、中割を自動生成するなどのCoreAnimationと似た機能を備える。タッチイベントのハンドリング、加速度センサーのデータへのアクセスも可能。MFiゲームコントローラーへのアクセスも可能
  • webbrowser
    • Pythonista内蔵のWebブラウザーでのサイトの表示、fileスキームでローカルに書き出したhtmlの表示、Safariのリーディングリストへの登録が可能
  • sound(音声)
    • 音声データを読み込んで再生できる。再生のピッチを指定できる。MIDIファイルの再生が可能
  • speech(音声合成)
    • 音声合成。AVSpeechSynthesizerを利用。言語指定可能
  • twitter(Twitter)
    • iOSに設定されたTwitterアカウント情報を利用した、ツイートの投稿、タイムライン、メンションの取得
  • ui(ネイティブUI)
    • Pythonista 3に内蔵されたUIデザイナーを使用してUIを作成、それをPythonスクリプトから利用。コードだけでUIを構築して利用。その両方が可能

iOSの機能を、かなり広範に利用できることが分かります。これにより、面白味のある、また実用性のあるPythonスクリプトを書くことができます。

別アプリとの連携

Pythonistaから、URL Schemeを使って別アプリを起動し、連携を取ることができます。

iOSにおいてトラディショナルなアプリケーション間連携方法ですが、Pythonista 3もサポートしています。

webbrowserモジュールのopenメソッドを使います。

# -*- coding: utf-8 -*-

import webbrowser
import urllib2
import sys

sys.setdefaultencoding('utf-8')

mes = urllib2.quote("ほげ")

webbrowser.open("tweetbot:///post?text="+mes)

objc_util使用例 1: 電源の状態やバッテリ残量の取得

強力なobjc_utilモジュール。使用例を紹介します。付属するサンプルの紹介となります。

Pythonista 3にはデバイス情報を取得できるUIDeviceにアクセスできるモジュールが付属しませんが、objc_utilモジュールのObjCClass(‘UIDevice’) でUIDeviceクラスをPython側に招聘し、それを使ってバッテリ残量を取得しています。

この要領でiOS上に存在する様々なクラスが利用できます。

# coding: utf-8

'''Simple demo of using UIDevice to query the current battery state'''

from objc_util import *

UIDevice = ObjCClass('UIDevice')
device = UIDevice.currentDevice()
battery_states = {1: 'unplugged', 2: 'charging', 3: 'full'}

device.setBatteryMonitoringEnabled_(True)
battery_percent = device.batteryLevel() * 100
state = device.batteryState()
state_str = battery_states.get(state, 'unknown')
print 'Battery level: %0.1f%% (%s)' % (battery_percent, state_str)
device.setBatteryMonitoringEnabled_(False)

objc_util使用例 2:「Pythonista」自身のハック

Objective-Cとのブリッジ機能を使うと、「Pythonista」自身のインスタンスを取得してハックできます。

# coding: utf-8

from objc_util import *

UIApplication = ObjCClass('UIApplication')

# Pythonista自身のインスタンスを取得
app = UIApplication.sharedApplication()

# Pythonistaのウインドウを取得
win = app.windows()[0]

# ビュー構造を再帰的にダンプ
win.recursiveDescription()

# ウインドウの透明度を設定
win.alpha = 0.5

# Pythonista内のクラスの取得
PythonistaWindow = ObjCClass('PythonistaWindow')

# インスタンス生成
pywin = PythonistaWindow.alloc()

「site-packages/pythonista_startup.py」(もしくはsite-packages2、site-packages3ディレクトリ以下のpythonista_startup.py)が起動時に初期化スクリプトとして自動的に実行されるので、ここに何らかのPythonista 3に対する変更を書いておくと、それを恒久的なものにできます。

Objective-CのMethod Swizzlingの手法を利用し、既存のクラスの挙動を変更することも可能です。

SiriKitの利用も

まだリリースされていませんが、開発アカウントがあれば利用できるiOS 10 beta。

Pythonnista 3をiOS 10 beta上で使用すれば、Pythonista 3からSiriKitが利用可能なはずです。

# coding: utf-8

from objc_util import *

ObjCClass('NSBundle').bundleWithPath_('/System/Library/Frameworks/Speech.ramework').load()
SFSpeechRecognizer = ObjCClass('SFSpeechRecognizer')

かようにObjective-Cとのブリッジ機能は強力で、何でもありです。

iOS上の様々な機能を、Appleの審査を通さず、いつでもどこでも思った時に利用可能なところが痛快です。

App Storeで流通するアプリにはできないことが、Pythonista 3用のスクリプトではできる、ということが多々ありうるわけです。

Pythonista 3へのアップデートで大幅な進化

Pythonista 3へのアップデートで、前バージョンから何が変わったのか。

以下の文書に記載があります。

新フィーチャーのハイライト

  • 新たにPython 3.5.1を搭載し、Python 2.7.5と両対応に
  • ブレークポイント、ステップ実行が可能な内蔵デバッガーと、スタックフレームビジュアライザを搭載
  • iPad Air 2以降でスプリットスクリーンに対応
  • カスタムUIのためのテーマ/シンタックスハイライティングエディタを搭載
  • 使用するPythonのバージョン切り替えに伴って表示内容を変更する内蔵ドキュメントブラウザを搭載
  • PEP-8スタイルチェッカーを搭載
  • あいまいマッチングに対応したコード補完機能と、ユーザー定義スニペット展開機能を搭載
  • メタデータの編集、アルバムの作成、画像内容の編集などが可能になるなど完全に刷新されたphotosモジュールの搭載

Python標準のデバッガーといえばpdbですが、Pythonista 3のデバッガーはビジュアライズされた使いやすいもの。例えば、このスクリーンショット。

main関数にブレークポイントを仕掛けて、ステップ実行で26行目の「img.show()」まで進行したところでソースコード上の変数linkをタップ。中身のunicodeテキストがインラインで表示されています。

続いて、こちらのスクリーンショット。

スクリーンショット1枚目: デバッグ機能を司る子ウインドウです。変数一覧表示、ステップ実行のコントローラがあります。UIColorのオブジェクトが入った変数の場合は、プレビューチップでその色が確認できます。UI部品のオブジェクトが入った変数の場合は、Quick Lookボタンが表示され、そこから実際の姿をプレビューできます。変数がオブジェクトの場合、メソッドの一覧が見らます。今見えているVariablesタブのほかに、Codeタブがあります。こちらがスタックフレームビジュアライザ。

スクリーンショット2枚目: UIのデバッグにも対応しています。UISliderのオブジェクトが入った変数s2のQuick Lookボタンを押すと、実際の外観が確認できます。

強力過ぎてちょっと引く

iOSデバイス上でのプログラミングを支援する出来のいいエディタ、さまざまな実行方法を選べる自由度、iOSやObjective-Cの機能をフル活用できるプログラミングの柔軟性、そして活発なコミュニティと、楽しい要素が揃い踏みのPythonista 3。

今回のメジャーアップデートでデバッグが効率的にできるようになり、さらに凄みが出てきました。

このパワーをあなたのiOSライフに取り入れてみませんか?

Pythonista 3App
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)

リファレンスブラウザのDashも便利。Pythonistaユーザが作ったDashで使えるPythonistaのDocsetsがあります。こちらも要チェックです。

Dash API DocsApp
カテゴリ: Productivity
販売元: Bogdan Popescu(サイズ: 4.2 MB)
全てのバージョンの評価: (0 件の評価)

 - iOS