IPython 利用ノート¶
本稿は IPython に関する個人的な覚え書きである。 NumPy, SciPy, Matplotlib のドキュメントを読んでいるとこのツールの名前が頻繁に出てくる。無視するのはもったいない気がするので調査する。
Note
OS
Windows 7 Home Premium x64 SP1
Windows 10 Home x64
設定ファイルの辺りだけ WSL2
本稿において、利用した各パッケージのバージョンは次のとおり。
Note
本稿では文字列 %PYTHONDIR%
を python.exe
が存在するディレクトリーのパスを意味する環境変数のようなものを表現するものであることにする。例えば、正規の Python 3.5 インストーラーを用いて D ドライブ直下にインストールした環境ではこの値は D:\Python35
であり、 Miniconda の 3.5 インストーラーを用いて D ドライブ直下にインストールした環境ではこの値は
D:\Miniconda3
である。
IPython とは何か¶
ドキュメントによると <IPython is meant to work as a drop-in replacement for the standard interactive interpreter> だそうだ。標準の Python インタープリターの上位版のようなモノだ。
インストールから初回起動まで¶
次の条件を初回条件と呼ぶことにする。
Python がインストール済みである。
conda または pip の実行ファイルのあるフォルダーに
PATH
が通っている。
これを満たす環境において、一般のサードパーティー製 Python パッケージのインストール手順 に示したようにすると IPython をインストールできる。
次に conda によるインストール手続きの例を示す。
bash$ conda install ipython
Fetching package metadata: ....
Solving package specifications: .........
Package plan for installation in environment D:\Miniconda3:
The following packages will be downloaded:
package | build
---------------------------|-----------------
vs2015_runtime-14.0.25123 | 0 1.9 MB
colorama-0.3.7 | py35_0 19 KB
conda-env-2.5.2 | py35_0 67 KB
decorator-4.0.10 | py35_0 12 KB
ipython_genutils-0.1.0 | py35_0 33 KB
menuinst-1.4.1 | py35_0 107 KB
path.py-8.2.1 | py35_0 47 KB
pycosat-0.6.1 | py35_1 80 KB
pygments-2.1.3 | py35_0 1.3 MB
pyyaml-3.11 | py35_4 169 KB
requests-2.10.0 | py35_0 656 KB
ruamel_yaml-0.11.14 | py35_0 217 KB
setuptools-23.0.0 | py35_0 692 KB
simplegeneric-0.8.1 | py35_1 7 KB
six-1.10.0 | py35_0 8 KB
wcwidth-0.1.7 | py35_0 21 KB
win_unicode_console-0.5 | py35_0 27 KB
conda-4.1.11 | py35_0 247 KB
pickleshare-0.7.3 | py35_0 8 KB
pip-8.1.2 | py35_0 1.6 MB
prompt_toolkit-1.0.3 | py35_0 308 KB
traitlets-4.2.2 | py35_0 113 KB
ipython-5.0.0 | py35_0 1.0 MB
------------------------------------------------------------
Total: 8.6 MB
The following NEW packages will be INSTALLED:
colorama: 0.3.7-py35_0
conda: 4.1.11-py35_0
conda-env: 2.5.2-py35_0
decorator: 4.0.10-py35_0
ipython: 5.0.0-py35_0
ipython_genutils: 0.1.0-py35_0
menuinst: 1.4.1-py35_0
path.py: 8.2.1-py35_0
pickleshare: 0.7.3-py35_0
pip: 8.1.2-py35_0
prompt_toolkit: 1.0.3-py35_0
pycosat: 0.6.1-py35_1
pygments: 2.1.3-py35_0
pyyaml: 3.11-py35_4
requests: 2.10.0-py35_0
ruamel_yaml: 0.11.14-py35_0
setuptools: 23.0.0-py35_0
simplegeneric: 0.8.1-py35_1
six: 1.10.0-py35_0
traitlets: 4.2.2-py35_0
vs2015_runtime: 14.0.25123-0
wcwidth: 0.1.7-py35_0
wheel: 0.29.0-py35_0
win_unicode_console: 0.5-py35_0
Proceed ([y]/n)?
初回起動¶
%PYTHONDIR%\Scripts\ipython3.exe
を起動するだけでよい。Windows の
ファイル名を指定して実行 で同実行ファイルを指定すると、コンソールウィンドウが出現する。
私の環境でのスタートアップ時の出力を記す。
WARNING: Readline services not available or not loaded.
WARNING: Proper color support under MS Windows requires the pyreadline library.
You can find it at:
http://ipython.org/pyreadline.html
Defaulting color scheme to 'NoColor'
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.
IPython 3.0.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
WARNING のメッセージが気になるので、ここから攻める。指示に従い pyreadline なるパッケージをインストールしよう。
PyReadline をインストール¶
Note
このパッケージは IPython 5.0.0 では依存関係がなくなっているようだ。
名前からして Python 版 readline と思われるパッケージを pip でインストールして、再度 IPython を起動したい。
bash$ pip install pyreadline
Downloading/unpacking pyreadline
Running setup.py (path:D:\cygwin64\tmp\pip_build_work\pyreadline\setup.py) egg_info for package pyreadline
package init file 'pyreadline\configuration\__init__.py' not found (or not a regular file)
Installing collected packages: pyreadline
Running setup.py install for pyreadline
package init file 'pyreadline\configuration\__init__.py' not found (or not a regular file)
Successfully installed pyreadline
Cleaning up...
インストール後 ipython を起動すると次の変化が見られた。
WARNING メッセージが表示されなくなった。
In [1]:
,Out [1]:
等のプロンプト文字列に色がついた。例えば Ctrl + A (以下 Emacs 風に表記する。これは C-a と表記することになる)で「キャレットがコマンドライン行の先頭に移動する」等の Emacs 風のキーバインドがなされている。これが一番ありがたい変化。この機能があるというだけで私には通常の Python 対話モードから IPython に乗り換える動機になる。
よい変化なので、PyReadline のインストールの状態を保ったまま先に進もう。
テスト¶
ここで IPython の動作確認テストを行いたい。
IPython 3.0.0¶
公式ドキュメントに従い、初回条件で iptest を実行すると以下のようになった。
bash$ iptest3
Traceback (most recent call last):
File "D:\Python34\lib\runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "D:\Python34\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "D:\Python34\Scripts\iptest3.exe\__main__.py", line 5, in <module>
File "D:\Python34\lib\site-packages\IPython\testing\iptestcontroller.py", line 20, in <module>
import requests
ImportError: No module named 'requests'
モジュール
requests
を別途インストールする必要がありそうだ。インストールしたが、今度は
ImportError: you need to have pywin32 installed for this to work
なるエラーが。
結論としては、これは面倒そうなので諦めた。
IPython 4.0.0¶
一連の自動テストが実行された。エラーがボロボロと現れる。
bash$ iptest3
Test group: core
............................
省略
______________________________________________________________________
Test suite completed for system with the following information:
IPython version: 4.0.0
IPython commit : f534027 (installation)
IPython package: d:\python35\lib\site-packages\IPython
Python version : 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)]
sys.executable : d:\python35\python.exe
Platform : Windows-10.0.10240
Tools and libraries available at test time:
matplotlib pygments sqlite3
Status: ERROR - 1 out of 7 test groups failed (core). Took 125.286s.
You may wish to rerun these, with:
iptest core
IPython 5.0.0¶
Conda で IPython をインストールしたところ、Scripts
に iptest3
がないようだ。開発版では当然存在する。
環境設定¶
IPython の挙動を次の各項目により制御できるはずなので、本章ではそれらを調べていこう。
環境変数
設定ファイル
コマンドライン引数
環境変数による設定¶
既定では、IPython は使用者固有の設定ファイル群(プロファイル)を次の優先順位で定まるディレクトリーから読み込む:
環境変数
IPYTHONDIR
が定義されていればディレクトリー$IPYTHONDIR
環境変数
XDG_CONFIG_HOME
が定義されていればディレクトリー$XDG_CONFIG_HOME/.ipython/
ディレクトリー
$HOME/.config/
が存在すればディレクトリー$HOME/.config/ipython
ディレクトリー
$HOME/.ipython/
XDG Base Directory 利用ノート の方針に従い、次のことを実施しておく:
ディレクトリー
$HOME/.config/ipython
を用意する上記ノートで述べように当該 XDG 環境変数を定義しておく
心配なら対話シェル初期化スクリプトで次の定義を入れておく:
export IPYTHONDIR="$XDG_CONFIG_HOME/ipython"
現在の設定ファイル置場パスは、コマンドラインから次を実行して確認可能だ:
$ ipython locate
/home/USERNAME/.config/ipython
設定ファイルによる設定¶
設定ファイル置場が定まったので、IPython 設定ディレクトリーにプロファイルと呼ばれる設定ファイルの雛形を作成する:
bash$ ipython profile create
[ProfileCreate] Generating default config file: PosixPath('/home/USERNAME/.config/ipython/profile_dummy/ipython_config.py')
[ProfileCreate] Generating default config file: PosixPath('/home/USERNAME/.config/ipython/profile_dummy/ipython_kernel_config.py')
これでテンプレファイル ipython_config.py
ができあがった。テキストエディターでこれを開き、有効にしたい箇所のコメントアウトを解除するとよさそうだ。
c.InteractiveShellApp.pylab = 'auto'
これぐらいやっておくと、NumPy や Matplotlib の構成要素のインポートを自動的に行なってくれる。例えば import numpy as np
しなくても np.arange(10)
のようなコードが通じる。さらに、下記の項目を有効にすると np.
すら不要になる。
c.InteractiveShellApp.pylab_import_all = True
一見タイプの手間が省けて便利なようだが、たまにこれらのパッケージの識別子の名前と
Python 組み込みのオブジェクトの識別子がカブるようなもの (e.g. all
,
any
, etc.) があると事態が少々複雑になる。個人的には全インポートは無効にしておき、 NumPy や Matplotlib のモジュールとしてのインポートだけに留めておきたい。
敢えて NumPy と Matplotlib の自動インポートを抑制した状況でセッションを開きたい場合は名前付きプロファイルを生成して、設定ファイルの対応項目を False にする。そして、IPython 起動時に --profile
コマンドラインオプションで設定名を指示する。
$ ipython profile create sympy
$ edit $XDG_CONFIG_HOME/ipython/profile_sympy/ipython_config.py
$ ipython --profile=sympy
コマンドライン引数による設定¶
プロファイルディレクトリーをコマンドラインから指定することも可能だ:
$ ipython --ipython-dir=/path/to/ipython-dir --profile=my-profile
IPython のすべての設定可能な値はコマンドライン引数から構成できる。
通常は次の形式で指定する:
ipython --ClassName.attribute=value
ただし頻繁に用いられるオプションは短い別名形式が用意してある。例えば
ipython --matplotlib
など。そのようなオプションの一覧は
ipython help
の Options のセクションで確認できる。
コマンドラインで指定したオプションは、設定ファイルのそれを上書きする。
使い勝手を試す¶
IPython コンソールウィンドウでの各種機能をひと通り試していこう。
単に
?
を入力することで IPython に関するちょっとしたドキュメントが出力する。10 ページ弱で終了する。%quickref で Quick Reference Card なるドキュメントが出力する。こちらはページ数が多め。
引数なしの
help()
で対話的ヘルプモードになる。通常の
help(X)
では、普通の Python コンソール同様の機能 X に関するヘルプが出力することを確認した。
X?
で IPython スタイルの機能 X に関するヘルプが出力することを確認した。X??
で詳細な情報が出力されるとのことだが、あまり変わらない?
タイプが面倒に感じたら、即タブキーを押す。残り文字列が補完されて便利。
補完されるのは識別子、Python キーワード。なんとファイルパスも補完対象。
%pdoc X で機能 X の docstring が出力することを確認した。
%pfile X でモジュール X のテキスト的な内容が出力することを確認した。
%timeit と %%timeit を試した。
%lsmagic で利用可能なマジックの一覧と %automagic スイッチの ON/OFF 状況が出力することを確認した。
%history でコマンド入力の履歴が出力することを確認した。
詳しくは後述する。
!X
でシステムシェルコマンド X を実行できることを確認した。
マジック機能のメモがたくさんできるがしょうがない。 Built-in magic commands を眺めて使えそうなものを試そう。
%who, %whos で自分が定義した識別子のリストを出力できる。後者は利用回数も確認できてたいへん便利。
履歴機能操作は readline に強く依存することに留意するべし。
C-r で Bash でいうところの reverse-i-search 機能が使える。すなわち、過去のコマンド入力をインクリメンタルサーチする。
C-p, C-n, 上矢印または下矢印キーで入力履歴を一個ずつ移動できる。
履歴リストについて。
オプション
-n
を常に指定して、履歴番号を表示するようにしたい。この番号情報を基に %recall することになるはずだから。例えば %history -g print のようにすると履歴の grep が行える。オプション
-g
を指定するときには、同じコマンド入力が重複して出力されないように、オプション-u
も併せて指定することも許される。オプション
-l
で直近の数コマンドだけを表示できる。オプション
-o
と-p
を同時に指定すると、履歴の表示が doctest の書式で出力される。このテキストをこのノートにそのまま貼り付けて、サンプルコードのメモ作業を楽にすることもできる。
TBW: 自動インデントの空白文字数調整
ログ機能について。
%logstart でセッションログを保存できる。コンソールでの入出力を適宜テキストファイルに保存するものだ。
TBW: %alias
Input caching system: IPython が記憶しているユーザーのコンソールでの入力を再利用できる。
_i
で 1 つ前の入力を得られる。_ii
で 2 つ前の入力を得られる。_iii
で 3 つ前の入力を得られる。リスト
In
,_ih
でプロンプト番号を添字にして入力を得られる。実は
_i5
やら_i100
やらからも(もし存在すれば)入力を得られる。
Output caching system: 上記の機能の出力バージョン。
_
で 1 つ前の出力を得られる。通常の Python コンソールと同じ。__
で 2 つ前の出力を得られる。___
で 3 つ前の出力を得られる。辞書
Out
,_oh
でプロンプト番号をキーにして出力を得られる。
ディレクトリー移動履歴も管理している。
リスト
_dh
に作業ディレクトリーをユーザーが訪問した順に保存する。コマンド %cd X を実行すれば、作業ディレクトリーを X に移動する。
コマンド %dhist を実行すれば、作業ディレクトリーを訪問順に一覧できる。
スクリプトを IPython のセッションから起動できる。次のコード片は自作のスクリプトを %run コマンドにより起動した様子を再現したものだ。
In [1]: %run ~/bin/listmanager.py remove showa_yojyo bot zzz 0-15: Wait... 0-15: OK: zzz
スクリプトのファイル名の拡張子は省略可能のようだ。
オプション
-t
で実行時間を測定する。コマンドラインでいうところの time python commands のようなものだ。例を示す。In [1]: %run -t ./bin/mjscore.py -F --today 集計期間 2016/09/01 00:40 - 2016/09/01 02:13 ... IPython CPU timings (estimated): User : 1.20 s. System : 0.00 s. Wall time: 1.19 s.
オプション
-d
で対象を pdb の支配下で実行する。ブレイクポイント等のデバッガーオプションも同時に指定できる。オプション
-p [profile options]
でプロファイルをとれる。というより、コマンド %prun のラッパーだと思われる。オプション
-m module_name
で指定モジュールをスクリプトとして実行する。コマンドラインでいうところの python -m module の Python コード限定版という感じだ。
%prun, %%prun はプロファイラー付きでコードを実行する。コマンドラインで python -m cProfile [options] file を実行するのに近い。
複数行に亘る関数の定義のコーディングは IPython ウィンドウ内で行うよりも、常用しているテキストエディターで行えるほうが効率的だ。コマンド %edit はそれを実現する。このコマンドを実行すると、デフォルトでは notepad が開く。ここでコードを書いて保存して閉じる。すると IPython のセッションにその内容が伝わる。エディターで定義した関数を呼び出すことができる。
In [2]: %edit IPython will make a temporary file named: D:\Temp\ipython_edit_3cn_y47j\ipython_edit_osmxydqq.py Editing... done. Executing edited code... Out[2]: 'def need_to_be_in_love():\n\tpass\n' In [3]: need_to_be_in_love() In [4]:
notepad では逆にテキスト編集の効率が落ちるはずなので、オプション
TerminalInteractiveShell.editor
で馴染みのテキストエディターを指定する。# Set the editor used by IPython (default to $EDITOR/vi/notepad). c.TerminalInteractiveShell.editor = 'D:/Program Files/xyzzy/xyzzy.exe'
クリップボードの内容を Python のコードとして評価することができる。
キーボードで C-S-v を押すと、クリップボードに保存されている Python コードを即時評価する。
コマンド %paste を実行すると、いったんクリップボードの内容を画面にエコーしてから、コード内容を評価する。
代わりにコマンド %cpaste を実行すると、まずはクリップボードに保存されている Python コードの編集モードになる。次にユーザーが
--
という行を入力すると編集終了となり、そこに書かれたコードが最終的に評価される。
作業内容のリセット機能がある。
コマンド %reset でセッションの各種状態(ユーザー定義のオブジェクト、入力履歴、出力履歴、ディレクトリー移動履歴)をクリアすることができる。
異色なのは %reset array だろう。NumPy の配列オブジェクトをすべて削除するというものだ。
コマンド %reset_selective を用いれば、クリアしたいユーザー定義のオブジェクトを正規表現で指定できる。
Todo
Windows だと ! コマンドが使えてもあまりうれしくない。 Cygwin のコマンドを使いたいので設定可能か調べる。単に
/bin
にPATH
を通すだけかもしれない。Output caching system の
_<n>
の有効な n を知りたい場合は?
Qt コンソールを試す¶
Warning
本節の記述は現時点では公式に deprecated 扱いされている。 Jupyter とやらを利用するようにとのことだ。
PyQt と PyZMQ が利用可能であれば、IPython を PyQt ウィンドウで再現できる。私の環境では PyQt はインストールが済んでいるものの、PyZMQ が入っていなかった。本節では PyZMQ のインストール作業から記す。
PyZMQ をインストールする¶
PyZMQ が何であるのかを理解するのは後回しにして、まずはインストールだ。IPython のドキュメントにあるように、素直に pip でインストールできる。
bash$ pip install pyzmq
Downloading/unpacking pyzmq
Installing collected packages: pyzmq
Successfully installed pyzmq
Cleaning up...
bash$ pip list | grep -i pyzmq
pyzmq (14.5.0)
Qt コンソールを起動する(シンプル)¶
Windows の ファイル名を指定して実行 で次のように指定する。
%PYTHONDIR%\Scripts\ipython3.exe qtconsole
一旦真っ黒なウィンドウが表示され、次に Qt ウィンドウが表示される。後者がコンソールとなる。通常の IPython のように使えるだけでなく、よく見ると便利なコマンドを起動するメニューがウィンドウ上部に備えられている。
Qt コンソールを起動する(プロットインライン)¶
Matplotlib のプロット図をインラインに Qt コンソール内に描画させる。この機能が Qt コンソールの目玉であると思われる。まずは IPython を次のようなコマンドライン引数を指定して起動する。ドキュメントには qtconsole --matplotlib inline と指定すると記されているが、私の環境ではダメだった。
%PYTHONDIR%\Scripts\ipython3.exe qtconsole --pylab=inline
試しに Matplotlib を内部的に利用した NetworkX のメソッドを経由して描画してみよう。
インラインでグラフを描画できて何がうれしいのかと言うと、このコンソールウィンドウを保存できるからだ。ファイルメニューの
を選択すると、コンソールでの入出力をHTML と画像とに分けてファイルとして保存できる。その他¶
YouTube で
IPython
で検索すると、面白いビデオが大量に見つかる。IPython Windows
等もよい。ConEmu ユーザーならば、当然 IPython をタブ化できるようにしておくのが筋だろう。ところで Qt コンソールウィンドウはタブ化できないのだろうか。「元ウィンドウ」はタブ化できる。
このノートをだいたい書き終わったあとに気づいたが、オライリーの Python によるデータ分析入門 という本が IPython を紹介するのに一章分紙幅を割いている。たいへんまとまっていて便利だ。