Pythonista3 でコードを実行するバージョン (3 or 2) を指定

Python には 2.x 系と 3.x 系のバージョンがあり、Pythonista3 は 2.7.12 と 3.6.1 をベースに作られている

ということを知っておきましょう。Pythonista3 では、どちらのバージョンの環境でコードを実行するか選ぶことができます (下図。スクリプト名の右にある ▷ を長押し)。通常はデフォルトのバージョン 3で問題ないはずですが、2系で書かれたコードを実行する際には print 文やモジュールのインポートでエラーが出る可能性が高いです。そういう場合には 2.7 でコードを実行しましょう (Run with Python 2.7)。

6DF76B93-53C3-4D19-B1AD-37FD314A1BD5.jpeg

StaSh 上の一部コマンドは Python 2 用に書かれている

Pythonista 3 に Django や py-tree といった Python のパッケージをインストールするのに本サイトでも便利に使用させてもらっている StaSh ですが、一部コマンドは Python 2 用に書かれているもののようです。なので、StaSh インストール後に普通に起動すると、デフォルトの Python 3.6 で実行されるので、警告が表示されます。

StaSh v0.7.2 on python 3.6.1
Warning: you are running StaSh in python3. Some commands may not work correctly in python3.
Please help us improving StaSh by reporting bugs on github.

Python 3 ではうまく動作しないコマンドや、Python 2 のパッケージをインストールしたり実行するには、Python 2.7 で実行する必要があります (▷アイコン長押し、Run with Python 2.7)。そうすれば上記の警告は出ません。

StaSh v0.7.2 on python 2.7.12

というわけで、Python 2.x 用に書かれたパッケージを pip でインストールしたい場合は、そもそも実行する StaSh を Python 2 で実行しなければなりません。毎回 ▷アイコンを長押しする?ちょっとスマートじゃないですね。

コードを実行するPython のバージョン (3 or 2) を指定する

コードを作成する際、実行する Python のバージョンを指定することができます。方法は簡単で、Python 2 で実行したい場合は以下のようにコードの最初の行にバージョンを明記してあげるだけです (コードを実行する言語を指定するこの方法を Shebang と言います)。パスがない分、Linux や macOS よりも簡単です。

#! python2
# coding: utf-8
# この下にコードを書いていく

StaSh の場合、Python 3 で実行したいとき (Django のインストールなど) と Python 2 で実行したい時 (StaSh 内のコマンドが Python 3 だとエラーを吐くなど) のケースがあるため、先頭の Shebang を変更した stash2.py と stash3.py の 2つのコードを書き、それぞれショートカットとして登録しておくと便利です。

Pythonista 3 に Django 2.0 をインストールする

過去の投稿のように、バージョンを指定してあげれば Django 2.0 も Pythonista 3 にインストールできます。ただ、詳細な原因は確認できていませんが、バージョン 2.0 しか今のところインストールできません。既に Django 1.x をインストール済みの場合は、削除する必要があります。

インストール済みの Django を削除 (StaSh を使用)

pip remove django

2.0 をインストール (2.0.1 以降は、2018/3/23 現在、Python 2.7 はサポート外というエラーで失敗します。もちろん Pythonista は最新の 3.6 でもです)

pip install django==2.0

StaSh で

pip list

としてバージョンを見ると 2.0.3 などと出ますがウソです。Console で確認しましょう。

import django
print(django.VERSION)

さて、 Django 1.x でプロジェクトを作っていた場合、manage.py に runserver --noreload を arg として渡してもエラーが出ます。おきまりの再起動と manage.py の実行を何度かすると、ForeignKeyon_delete がないというエラーになる場合があります。その場合は、エラーが出ている model.py を下の太字部分 (カンマ以降、閉じ括弧まで) を追加しましょう。

author = models.ForeignKey('auth.User', on_delete=models.PROTECT)

メジャーアップデートで色々と変更があるようですが、取り合えず Pythonista on iPhone として嬉しいのは admin ページがレスポンシブデザインになったというところが大きいと思います。楽しみましょう!

iOS Pythonista 3 で XServer に SSH 接続

Pythonista 3 の StaSh を使って SSH で XServer へ接続する

Pythonista 3 の StaSh を使ってホスティングサーバである XServer へ SSH 接続する方法です。ポイントは、XServer のサーバーパネルで「公開鍵認証用鍵ペアの生成」を行わず、StaSh の ssh-keygen コマンドでパスフレーズ無しのキーを作成するということ。パスフレーズを付けて作られたキーは StaSh のssh で動かないようです。おそらく他の SSH 接続を許可するホスティングサーバでも同様の方法で接続可能かと思いますのでお試しください。
XServer の SSH 設定方法 (公式) はこちら

StaSh でキーを作成

$ ssh-keygen -t rsa -b 2048

以下のパスに秘密鍵と公開鍵が作られる。

~/Documents/site-packages/stash/.ssh
$ ls
id_rsa id_rsa.pub

後は、公開鍵を XServer のサーバパネルで登録すれば、以下コマンドでサーバに SSH 接続できる。

SSH コマンド

$ ssh username@username.xsrv.jp -p 10022

(“username” は自分のアカウント名に差し替える)

初めて ssh コマンドを実行すると、どうやら自動的に pyte というターミナルエミュレータが pip でインストールされます。そのまま ssh コマンドを実行してもエラー global name 'pyte' is not defined と表示される場合は、Pythonista 3 を終了してから再度立ち上げてください。

(蛇足) SSH しているときの行数を指定

ここまできたらこっちのもの、.stashrc ファイルに alias を登録したり (こちらを参照)、他の iOS 端末や SSH アプリ、パソコン等に .ssh フォルダの中の ids_rsa を持って行ってそれらの環境で SSH 接続ができるようにすれば作業がはかどります。 ids_rsa ファイルは秘密鍵ですので、絶対に他の人に見られないよう取り扱いには注意しましょう。

一点 Pythonista 3 の StaSh で SSH 接続している際の残念な点は、入力中は画面下の [Tab] [H] [Up] などの StaSh のもつ特殊キーの列と iOS のキーボードのソフトウェアキーボードが常に出てしまうところです (Bluetooth キーボードを使用していても 3行分ほど狭くなる)。面倒ですがログインする端末に応じて、stty コマンドで、画面の行数を指定しまいましょう。一画面に収まって作業がしやすくなります。以下を参考に、自分の環境でちょうどいい行数を指定してみてください。

$ stty rows 51 # iPad mini 2 で外付けキーボードならここまでイケる
$ stty rows 27 # iPhone 8 Plus でソフトウェアキーボードならここまでイケる

Pythonista3 に py-tree をインストールする

ディレクトリ構成を一覧表示してくれる py-tree を Pythonista3 (iOS) にインストールし、使いやすくする方法、など

py-tree をインストールすると

こういうのができるようになります:

[mysite]$ tree
.
|-- db.sqlite3
|-- manage.py
|-- mysite
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- polls
    |-- __init__.py
    |-- admin.py
    |-- apps.py
    |-- models.py
    |-- tests.py
    |-- urls.py
    |-- views.py
    `-- migrations
        |-- 0001_initial.py
        `-- __init__.py

Pythonista3 に限った話ではありませんが、Web アプリなど階層構造でプロジェクトを作っている時には、CLI (Pythonista3 の場合は StaSh) でディレクトリとファイルの一覧を見たくなるものです。そんな時に便利なのが py-tree コマンドです。上の例のように表示できるので、デバッグする時などにも重宝します。

インストール

インストールは簡単で、StaSh で以下のコマンド ([stash]$ プロンプトの後の部分) を実行します。

[stash]$ pip install py-tree

“tree” で実行できるようにする

実行するのはもちろん py-tree [enter] です。が、ソフトウェアキーボードでハイフンを入力するのは一手間かかって面倒なので、tree と入力すれば実行できるようにしましょう。
StaSh では Linux のシェル bash にある .bashrc のように alias を .stashrc ファイルに記載して利用することができます。具体的な手順は以下の通りです:

[stash]$ cd site-packages/stash/
[stash]$ la
.gitignore .stash_history .stash_tips .travis.yml CHANGES.md LICENSE README.md __init__.py bin docs getstash.py lib man stash.py system
[stash]$ touch .stashrc
[stash]$ echo "alias tree='py-tree'" >> .stashrc
[stash]$ cat .stashrc
alias tree='py-tree'
[stash]$ la
.gitignore .stash_history .stash_tips .stashrc .travis.yml CHANGES.md LICENSE README.md __init__.py bin docs getstash.py lib man stash.py system

StaSh を一度終了してから再度実行すると、一番上のサンプルのように tree コマンドで階層表示ができるようになります。

(蛇足) Pythonista 3 で xxx.py 以外のファイルを作成、編集する

Pythonista3 単体では .stashrc のような名前のファイルは作れません (勝手に .py が付加されてしまう)。また、一度作るとドットで始まるファイルは不可視となり、編集できません。そのため、そのようなファイルを作る場合は、上記手順にあるように StaSh の touch コマンドでファイルを作り、edit コマンドで Pythonista3 の編集画面で開いてあげます。不可視ファイルは ls -a または同コマンドのエイリアスとしてデフォルトで登録されている la で確認することができます。

まとめ

目的コマンドサンプル
不可視ファイルを作るtouchtouch .invisible
ファイルを Pythonista3 で編集editedit .invisible
不可視ファイルを含むファイルを表示ls -a
または
la
la
(la .* で、不可視ファイルのみを表示)

Pythonista3 に Django をインストール

iPhone や iPad 向け app Pythonista3 に Django をインストールする方法:

まず、ググって Pythonista3 に StaSh をインストールしてください。日本語の情報も見つかります。必要そうならそのうちここにも記事を書きます。

StaSh が入ったら、StaSh から以下を実行します:

$ pip install Django==1.11.6

バージョンの “1.11.6” は、その時に利用できる LTS (Long Term Support) version にしたら良いでしょう。djangoproject.com のサイトをご確認ください。

Pythonista3 を終了し、再度開きます。 <– これは Pythonista3 で何か変更を加えた際にほぼ必ず実行すべきアクションなので、期待した通りの動きをしていない時などはやってみてください。本手順でも何度も出てきます。

StaSh で Django のプロジェクトを作ります。

$ django-admin.py startproject mysite

Pythonista3 を終了し、再度開きます。

/mysite/manage.py を開きます。
Console (右ヘスワイプ) で以下を実行します。

import sys
sys.path

表示結果から、以下のような行を見つけ、コピーします (「…」の部分は、iOS 端末固有の情報です)。

/private/var/mobile/.../Documents/mysite

左にスワイプし、manage.py の編集画面に戻ります。
import sys” の下に以下を追加します — 「ここに貼り付け」を、上記でコピーした内容に置き換えます。

sys.path.append=(“ここに貼り付け”)

すると、こんな感じになります (端末によって AppGroup/…/Pythonista3 の間は異なります):

sys.path.append("/private/var/mobile/Containers/Shared/AppGroup/C1F57ABC-DDDD-EEEE-FFFF-B0B0E0B0B0E7/Pythonista3/Documents/mysite/")

Pythonista3 を終了し、再度開きます。

/mysite/manage.py を開き、実行 (右三角) ボタンを長押しして開いた画面の argument に、“runserver --noreload” を追加します。ハイフン 2つをうまく入力できない場合は、ダブルクォーテーションの内部をコピペしてください。
改めて書きますが、何か想定外のエラーが発生した場合は Pythonista3 app を終了し、再度実行してください。
うまくいくと、以下のような内容が Console に表示されます:

Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 03, 2017 - 20:46:35
Django version 1.11.6, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

ここまできたら、http://127.0.0.1:8000/ を Safari などのウェブブラウザで開きます。
“It Worked!” ページが表示されたら Django のインストールと初期設定は完了です。Django のチュートリアルなどを参考に、ご自身のプロジェクトやアプリケーションを作りましょう。
Pythonista3 では Django への変更に対する自動更新ができない (--noreload) なので、期待通りの動作をしない場合は、Pythonista3 app の再起動をしてください。

以下は StaSh で Django をインストールした際のログです:

[~/Documents]$ pip list
[~/Documents]$ 
[~/Documents]$ 
[~/Documents]$ pip install django
Querying PyPI ... 
Error: Source distribution not available for Django: 2.0b1
[~/Documents]$ pip install Django==1.11.6
Querying PyPI ... 
Downloading package ...
Opening: https://pypi.python.org/packages/13/26/f3841e00663027ba7cf7ce7ba2cabb682a83cf0629bef013d70bebefa69d/Django-1.11.6.tar.gz
Save as: /private/var/mobile/Containers/Data/Application/20C8FA54-EEEE-FFFF-88888-3BACC5555555/tmp//Django-1.11.6.tar.gz (7874450 bytes)
   7874450  [100.00%]
Extracting archive file ...
Archive extracted.
Running setup file ...
Handling commandline script: django/bin/django-admin.py
Package installed: Django
Dependency available in Pythonista bundle : pytz
[~/Documents]$ 
[~/Documents]$ 
[~/Documents]$ which django
[~/Documents]$ pip list
Django (2.0b1) - A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
[~/Documents]$