iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る
2016/12/29
価値ある情報をユーザー視点で発信するブログ
2016/12/29
iOS用のアプリは通常、開発アカウントを取得し、Macを使って開発します。
開発アカウントを取得するほどではないが、iOSデバイス上で何かやりたい処理がある、という人はいるでしょう。
あるいは、プログラム好きな人なら率先してiOSデバイス上でプログラミングをしたいと思うのではないでしょうか。
そうしたニーズに存分にこたえることができる、iOSデバイス上で動作する統合開発環境がPythonista 3です。
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 3
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)
今回は、そんなPythonista 3を紹介。
Pythonの経験がない人は、Pythonista 3を忌避しようとするかもしれませんが、他言語でこれほどまでにお膳立ての整っているiOS上のセルフ開発環境はありません。
メソッドや制御の構文が非対称(閉じない。開きっぱなし)なのが気持ち悪いかもしれませんが、細かい違いは「python if文」などでググって確認する程度で使えると思うのです。この機会に使ってみませんか?
Pythonistaはアクティブなユーザーを抱えており、コミュニティが活発なので質問する場があります。サンプルも豊富です。Pythonが使えるようになれば、年収が上がる可能性もありますよ(笑)。
もくじ
Pythonista 3の通常価格は1,200円。高いようですが、それだけの価値はあります。
iOS上でのセルフ開発環境は、現時点においてPythonista 3が最良のものです。
Pythonista 3
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)
なお、旧バージョンであるPythonistaも併売されていますが、上位互換を保つPythonista 3に完全移行予定です。今から旧Pythonistaを買う必要はありません。
Pythonista 3のドキュメントはこちら。
ドキュメントは、Pythonista 3の中からも参照できます。
Pythonista 3を使えば、充実したコーディング補助機能に助けられながら電車の中で片手プログラミングもできてしまいます。iPadにキーボードをつないでバリバリやるスタイルもありでしょう。
iPad Air 2以降ならスプリットスクリーンにも対応しており、生産的な作業を補助する強力な脇役になります。
w00t! Pythonista 3 supports split-screen mode on iPad and has extended keyboard. pic.twitter.com/XJMklAQipe
— Keith Bradnam (@kbradnam) June 14, 2016
日常のPC作業で、ターミナルエミュレータを1枚常に開いているようなタイプの方ならぜひ使ってみてください。
Pythonista 3は素晴らしい。2008年から始まったApp Storeの歴史上、間違いなく最も刺激的なアプリです。その魅力を、あなたならきっと分かってくれるはず。
Pythonista 3はiOS上でPythonプログラミングを楽しめる統合開発環境。
インタプリタとしてのPython、それを取り囲むライブラリ、スクリプトを編集するエディタ、そして、PythonスクリプトをiOS上でさまざまな形で機能させるための各種機能を内包した統合開発環境です。
Pythonといえば、バージョン2系と3系が両方並行して使われていますが、Pythonista 3は、Python 3.5.1とPython 2.7.5の両方を搭載。
適宜切り替えたり、どちらかを指定して実行可能です。
「Python 2 to 3」というツールも用意され、Python 2用のスクリプトをPython 3に移行することもできるようになっています。
Pythonの標準モジュールはもちろん、必要性を鑑みて追加された人気モジュールが利用でき、一般的なPythonに関する知見をPythonista 3上で活用できます。
Dropbox、Evernoteモジュールなんかは熱いですね。
ちなみに、標準モジュールのxmlrpclibを使うと、WordPressをいじくり倒すことができます。Pythonistaで編集しているテキストをWordPressにアップロードするスクリプトなどが作れますよ。画像をWordPressにアップロードすることもできます。
個人的によく使うのは、ステートフルプログラムによるWebブラウジングが可能なmechanize。ドキュメントには記載がありませんが、Python 2.7側で利用可能です。
ログインすると発行されるCookieがWebブラウジングに必要なページなどにアクセスするときに使います。
Pythonの標準ライブラリでは、グラフ描画のmatplotlibなんかも好きです。
生成した画像は、下記の例ではインタラクティブコンソールに表示しているだけですが、カメラロールに保存するなり、ローカルに保存してどこかにアップロードするなり好きなように扱えます。
#!/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コマンドで外部モジュールを簡単に取り込むこともできます。
@stroughtonsmith Seriously, check out StaSh for Pythonista. https://t.co/Rqo9kUFRla. It's awesome. pic.twitter.com/XGHo8nfgrD
— Luke Taylor (@lukedeentaylor) March 25, 2016
関連エントリを書きました。
UIデザイナーを内蔵していて、UIを持ったスクリプトを作ることができます。
UIはiOSネイティブのもので、「似た別の何か」ではありません。
GUIで発生したタッチイベントとPythonコードをどう結びつけるか具体例を挙げます。新規作成で「Script with UI」を選択。これで*.pyと*.pyuiファイルの組が作られます。
まずは*.pyuiを開き、ボタンを一つ設置してタップで選択。画面右上の(i)アイコンをタップしてインスペクタを表示。
インスペクタの「Action」の項に、タップイベントと関連付けるスクリプト中のメソッド名を入力。
Pythonスクリプトの方では、先ほど入力したメソッド名のメソッドを定義。押したボタンのインスタンスが渡されてくるので、引数を一つ定義しておきます。
渡されたボタンのインスタンスを使って、ボタンのタイトルを変更するようにしました。
import ui import console def button_tapped(sender): sender.title = "Baka" console.alert("Pushed") v = ui.load_view() v.present('sheet')
実行するとウインドウが表示されるので、ボタンを押すとアラートが表示されます。ボタンのタイトルが「Baka」にも変わりました。
このような簡易的な作り方もできますが、自由度は高く、UI部品を自作している人もいます。
Pythonistaは2012年に登場。4年の歴史を持つアプリです。自由度とポテンシャルの高さから能動的なユーザーを多く擁し、公式のフォーラムが非常に活発。
いろいろな知見が共有されています。
フォーラムの有志が、成果物を共有しています。
Pythonista 3に興味を持つ人に、微に入り細に入りの解説は不要かもしれませんが一応基本操作を紹介。
ファイルブラウザの左端のアイコンをタップして、ファイルに新規作成のメニューを表示。
ここでは「Empty Script>Documents」を選びます。
編集領域をタップしてキーボードを表示。カーソル移動は、カスタムキーボードの上で指を左右にスライドさせることでもできます。
以下のスクリプトを入力しました。
import console console.alert("Hello, Pythonista!")
「im」まで入力すると補完候補に「import」が出てくるのでそれを選ぶ、といった感じでPythonista 3の入力支援機能の助けを借りて、ソフトウェアキーボードでもなかなかスピーディーにスクリプトが書けます。
外付けキーボードから操作しているなら、Tabキーで補完できます。Tabはカスタムキーボード左端の「→|」からも入力可能です。
コードエディタ右上の「▷」アイコンをタップすると、スクリプトの実行。
今回は、Pythonista 3専用のconsoleモジュールのalert()を実行したので、ダイアログが表示されました。
ちなみに、「▷」アイコンを長押しすると、引数指定、編集中のソースコードのスタイルチェック、分析(pyflakes)、テスト実行、インタプリタの一時的な切り替えが選べます。
試しにスタイルチェックを実行してみました。pep8というスタイルチェッカーでチェックができます。import文とスクリプト本文との間に、空白行が1行足りないという警告が出ました。何をチェックするのか、環境設定で個別に指定できます。
コードエディタはシンタックスカラーリングに対応していて、Pythonスクリプトが見やすい。
コード補完機能があるので、タイピング量を減らすことが可能。オブジェクトのメンバを考慮した補完候補が出るようになっています。
スクリプト中のメソッド定義、クラス定義を自動的に検出してアウトラインを作るので、定義間のジャンプが楽です。
Commandキーを使ったキーボードショートカットに対応。
Tabでのインデントはもちろん、Shift+Tabでのアンインデント、オートインデントにも対応。
さらに、好きなようにカスタムキーボードショートカットを組み込むことも可能です。
Pythonistaを構成するファイルブラウザ、コードエディタ、インタラクティブプロンプト。
前二つは既に出てきました。最後の一つ、インタラクティブプロンプトは、その名の通り、対話的にPythonのコードを実行するためのものです。
入力欄は最下段にあり、その上はPythonからの出力を表示する出力欄です。
入力欄にPythonスクリプトを入力したら、returnで実行。コード片を即座に実行できますので、大変便利です。実行履歴は記録され、履歴を呼び出して、再編集の上実行できます。
出力欄には入力欄で実行したスクリプトの返り値がログとなって流れていくほか、print文でスクリプト中から任意に出力することができます。デバッグプリントのコンソールとしての役目もあるわけですね。
出力欄にはテキストのみならず、Imageクラスのshowメソッドで画像を表示できます。
import photos p = photos.pic_image() p.show()
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()
editorモジュールを使うと、Pythonistaのコードエディタのいくつかのプロパティにアクセスでき、メソッドを利用できます。
コードエディタ上のテキスト、選択範囲情報などにアクセスして、Pythonistaを制御するスクリプトを書くことができます。
そのスクリプトをPythonistaのアクションメニューに登録・実行できるようになっています。
コードエディタで編集中に、メニューからアクションを呼び出して使うわけです。
以下のスクリプトのメソッドは、コードエディタで選択中のテキストを返すものです。
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内のファイルブラウザの一覧から実行する以外に、いろいろな方法で起動することができます。
スクリプトの起動に手間がかかることで利便性が低下することを憂慮する必要がありません。
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画面から直接起動できます。
Touch Icon Generatorと同等のものがPythonista 3から内蔵されました。
Pythonista 3には、通知センターウィジェットに関係した機能がありません。
Beta版には通知センターウィジェットを作る機能があったのですが、通知センターウィジェットで使えるメモリーが少ない関係で動作が安定せず、公開版からは削除されてしまいました。
「Launcher – 通知センターウィジェット搭載ランチャー」がPythonistaスクリプトを通知センターウィジェットから起動するためのランチャーとして使えます。登録するURLを「pythonista3://ScriptName?action=run」といったURLにします。
Launcher – 通知センターウィジェット搭載ランチャー
カテゴリ: Productivity
販売元: Cromulent Labs, Inc(サイズ: 17.7 MB)
全てのバージョンの評価: (535 件の評価)
notificationモジュールでローカル通知を登録し、通知センターからスクリプトを起動することもできますが、登録した通知をタップするとその1回で消えてしまうので、使い方に工夫を要します。
iOS標準の共有シートや、「Open In…」からのスクリプト実行が可能です。
TwitterクライアントやWebブラウザからURLを受け取って、テキストエディタからテキストを受け取って、GoodReaderのようなファイラーから任意のファイルを受け取って、カメラアプリから画像を受け取って、Pythonスクリプトで処理が可能なのです。
プログラミングで重要なのは、処理対象です。その点、Pythonista 3は、カメラロール、クリップボード、URL Scheme経由のクエリのやりとり、Open In…、共有シートとアプリケーション連携に必要なiOSの機能に幅広く対応しており、用途は無限大です。
Open In…、共有シートからのデータの取得をするものは「Extension」というカテゴリのスクリプトとなりますが、サンプルが付属しています。動作とスクリプトを見てみます。
公式Twitterの共有シートから「Run Pythonista Script」を選んでみます。
「Copy Photo Location」、「Image Histogram」などアイコンが並んでいますが、これが「Pythonista」上に登録された「Extension」カテゴリのPythonスクリプトです。その上の段のScratchpadは簡易テキストエディタで、この場でスクリプトを書いて実行できます。その隣のConsoleは対話式に1行1行ワンライナーを実行できます。iOSの方々に「Pythonista」が出張していって、iOS全体が開発環境になったかのようです。
公式TwitterクライアントからツイートへのURLが渡されていますので、ここでは、「URL to QR Code」をタップしてみます。
PythonスクリプトでQRコードが生成されて、それが表示されました。
スクリプトの中身を見てみましょう。
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
スクリプトの起動方法のバリエーションの多さからその片鱗を感じていただけているかと思いますが、Pythonista 3の重要な特長に、iOSの機能を自由に使える拡張性の高さ、iOSとの親和性の高さが挙げられます。
その自由度の具体例についてはobjc_utilモジュールのところで解説。
Pythonista 3には、他のアプリとの連携ができるよう、また、iOSの多彩な機能がPythonから利用できるよう、専用モジュールがバンドルされています。
専用モジュールの一覧はこちらにあります。
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モジュール。使用例を紹介します。付属するサンプルの紹介となります。
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)
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の手法を利用し、既存のクラスの挙動を変更することも可能です。
まだリリースされていませんが、開発アカウントがあれば利用できる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へのアップデートで、前バージョンから何が変わったのか。
以下の文書に記載があります。
Python標準のデバッガーといえばpdbですが、Pythonista 3のデバッガーはビジュアライズされた使いやすいもの。例えば、このスクリーンショット。
I've started working on an actual debugger for Pythonista. It's not quite done yet, but here's a sneak peek: pic.twitter.com/tC18oS4e4r
— omz (@olemoritz) March 12, 2016
main関数にブレークポイントを仕掛けて、ステップ実行で26行目の「img.show()」まで進行したところでソースコード上の変数linkをタップ。中身のunicodeテキストがインラインで表示されています。
続いて、こちらのスクリーンショット。
@olemoritz ...it also supports debugging UIs. pic.twitter.com/FvJKgiMtG4
— omz (@olemoritz) March 12, 2016
スクリーンショット1枚目: デバッグ機能を司る子ウインドウです。変数一覧表示、ステップ実行のコントローラがあります。UIColorのオブジェクトが入った変数の場合は、プレビューチップでその色が確認できます。UI部品のオブジェクトが入った変数の場合は、Quick Lookボタンが表示され、そこから実際の姿をプレビューできます。変数がオブジェクトの場合、メソッドの一覧が見らます。今見えているVariablesタブのほかに、Codeタブがあります。こちらがスタックフレームビジュアライザ。
スクリーンショット2枚目: UIのデバッグにも対応しています。UISliderのオブジェクトが入った変数s2のQuick Lookボタンを押すと、実際の外観が確認できます。
iOSデバイス上でのプログラミングを支援する出来のいいエディタ、さまざまな実行方法を選べる自由度、iOSやObjective-Cの機能をフル活用できるプログラミングの柔軟性、そして活発なコミュニティと、楽しい要素が揃い踏みのPythonista 3。
今回のメジャーアップデートでデバッグが効率的にできるようになり、さらに凄みが出てきました。
このパワーをあなたのiOSライフに取り入れてみませんか?
Pythonista 3
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)
リファレンスブラウザのDashも便利。Pythonistaユーザが作ったDashで使えるPythonistaのDocsetsがあります。こちらも要チェックです。
Dash API Docs
カテゴリ: Productivity
販売元: Bogdan Popescu(サイズ: 4.2 MB)
全てのバージョンの評価: (0 件の評価)