思索的逍遥の記。

いろいろな考え事。

Pythonista をショートカットからURLスキームで起動する

以前、iOSのショートカットアプリからPythonistaを起動する方法について記事を書いたが、その記事で追記したように、iOS 13では引数の受け渡しが動作しない。

sutukeisu.hatenablog.com

その後Pythonistaはバージョン3.3にアップデートされたが、このバグは現在(2020/04/18)も残っている。将来的には修正されると思われるが、一方で、現時点でもショートカットアプリからPythonistaに引数を受け渡しつつ、Pythonスクリプトを実行することは可能である。どうするかというと、URLスキームを利用する。Pythonista 3.3は以前のバージョンよりURLスキームを利用しやすくなったので、せっかくだから上記記事で扱ったスクリプトを実行できるかどうか検証した。ちゃんと動作することを確認したので、その手順を以下に示していく。

共有シートから呼び出せるショートカットとして設定する

とりあえずショートカットアプリで、新しいショートカット を作成する。今回は「Google翻訳」という名前のショートカットにした。 ブラウザで外国語のページを開いている時、共有シート(たいてい上矢印のボタンで出てくる)からショートカットを呼び出せるようにしたいので、右上の「」ボタンで詳細設定画面を開いたあと、以下のように「共有シートに表示」を有効にし、共有シートタイプを「URL」に設定する。

(この設定は前回も行なっていたが、説明を省いていた。)

URLスキームを変数に代入する

特定のPythonistaスクリプトを起動できるURLを手に入れた(後述)として、以下のように「テキスト」アクションにそのURLを貼り付け、それを「変数」アクションで、「URLスキーム」という名前の変数に紐付ける。

また、スクリプトに引数(例:hoge)を渡したいときは、&args=hogeという文字列を付け足すことで実現できる(参考:The Pythonista URL Scheme)。なので、今回はあらかじめ&args=という部分だけ別個に用意し、「変数」という変数に紐付けた。

(引数を2つ以上渡したい場合、コマンドライン引数の要領で&args=hoge fugaと半角スペースを挟むと、別個の引数として認識される……と言いたいところだが、上記参考ページにもあるように、手動エスケープ処理といった感じで、半角スペースを%20とする必要がある。よって&args=hoge%20fugaとすると良いだろう。)

さて、最初に「特定のPythonistaスクリプトを起動できるURLを手に入れた」という仮定を置いたが、どこからこれを仕入れれば良いのだろう? 参考ページにあった仕様に従って、自分でURLを書き出しても良いが、もっと簡単にURLを取得する方法がある。

まず、Pythonistaアプリで、ショートカットで起動したいスクリプトを開く。右上にレンチボタン(下画像の赤丸の中)があるので、これをタップする。するとメニューが開き、"Shortcuts..." というボタンがあるのでそれをタップする。

次に、表示されたリストの中から"Pythonista URL"を選び、タップする。

最後に、遷移したページの一番上にある"Copy URL"をタップする。

これでクリップボードに、現在開いているスクリプトを起動するためのURLがコピーされる。あとは前述したように、ショートカットの作成画面でそのURLを扱えば良い。

URLを引数に取らなかったときの処理を設定する

現状、ウィジェットボタンやショートカットアプリからの直接起動にも対応しているので、引数としてURLを与えられないケースがある。そのときのための処理を設定する。

if ... else ...のような構文にあたる「もし○○ならば〜その他の場合」アクションを使う。「〇〇」の部分は、「ショートカットの入力」の「値がない」というケースを指定する。if節には、「URL」アクションを置いて、変数「URLスキーム」を紐づける。「URLを開く」アクションにこの「URL」アクションを紐づければ、ショートカット動作時に、Pythonスクリプトが(引数を伴わずに)起動する。

(なお、「URL」アクションを使わずに、直接「URLスキーム」変数を「URLを開く」に入れることも可能だと思うが、あとで見た時のわかりやすさのためにこのような手順にしている。)

URLを引数に取るときの処理を設定する

あとはelse節で、本来の目的である「引数を取る場合」の処理を設定する。if節の「URL」アクションは変数「URLスキーム」のみを格納したが、これに変数「変数」と、「ショートカットの入力」(中身はウェブページへのURL)を結合してURLとしたい。そのためには、単純にこれらを「URL」アクションに横並びに入力すればよい。

以上で「Google翻訳」ショートカットは完成である。あとはスクリプト側で、sys.argvを使ってコマンドライン引数にアクセスできる。

自分のiPhone(XR)でこのショートカットが動作することを確認している。実際にはショートカットを経由しないGoogle翻訳スクリプトを自作して使用しているが……(下記の記事)。

sutukeisu.hatenablog.com

とはいえ、ショートカットアプリならSiriとの連携などが可能になるので、自作スクリプトの利用の幅はさらに増えるだろう。