IPython — 強力な対話型Python実行環境
対話型実行環境
起動
ターミナルから ipython を実行するか、
普通の対話Pythonから:
import IPython
IPython.start_ipython(argv=[])
とりあえずドキュメントを読む:
?
%quickref
文脈を考慮したタブ補完
定義済み変数などはある程度 rlcompleter でも補完できるが、
IPythonはさらに文脈を考慮して賢い補完をしてくれる:
import o[TAB]
import os.[TAB]
open('~/.[TAB]')
履歴
- 上下キーで単純に遡る
- 途中まで入力して ctrlp で前方一致する履歴のみ遡る
- ctrlr から部分一致する履歴を検索
%hist- input cache:
_i,_ii,_iii,_ih[n],_i<n> - output cache:
_,__,___,_oh[n],_<n> - directory:
_dh
Object introspection
https://ipython.readthedocs.io/en/stable/interactive/reference.html#dynamic-object-information
関数がどんな引数をとるか、
クラスがどんなメンバを持っているか、
などをパッと覗くことができる。
help() コマンドの強力版。
先頭(か末尾)にクエスチョンをつけるだけ:
?os
??os
%pdoc <object>: docstring%pdef <object>: ?%psource <object>: 定義しているソースコード%pfile <object>: 定義しているファイル全体
システムコマンド実行
頭にエクスクラメーションをつけるだけ:
!pwd
files = !ls
マジックコマンド
https://ipython.readthedocs.io/en/stable/interactive/magics.html
- 一行単位の line magic は
%で始める。 - 複数行うけつける cell magic は
%%で始める。 - デフォルトの
automagic = Trueでは%が省略可能で怖い。
環境設定
https://ipython.readthedocs.io/en/stable/config/intro.html
ipython help profile
ipython profile create [name]
ipython profile list
ipython profile locate
ipython --profile=<name>
~/.ipython/profile_default/ipython_config.py
起動時に自動的に pandas や matplotlib を読み込むとか。 automagicを切るとか。
Jupyter
ウェブブラウザ上で動く対話的実行環境。 元はIPython Notebookだったが、 カーネルを入れ替えることで他言語を扱うことが可能になり、 汎用Jupyter Notebookとして生まれ変わった。 それをさらに開発環境として洗練させたのがJupyterLab。
ノートブック形式 .ipynb は
Markdown/LaTeX記法による見出し・コメント・数式とともに
ソースコードと実行結果をひとまとめに保存しておけるので、
研究ノートのような使い方に向いている。
Mathematica/Mapleの使い勝手に似ている。
GitHub上でも直接閲覧できるし、VSCode でも扱える。
ターミナルやテキストエディタに馴染みのない非プログラマ向けには便利だろう。
ファイルがインプット・アウトプット混在の複雑なテキストになるので、 コマンドラインやGit上での取り回しが悪いのは致命的な欠点。 後述のJupytextがこれを回避する救世主かもしれない。
始め方
https://jupyterlab.readthedocs.io/en/stable/getting_started/starting.html
- 適当な作業ディレクトリを作って移動:
mkdir -p ~/jupyter; cd $_ - ターミナルから起動:
jupyter lab [file or directory] - ウェブブラウザで
http://localhost:8888/lab/が立ち上がる - Launcher内のNotebookにある適当なカーネル (e.g., Python 3) を選択
[ ]:の右の箱に適当なコマンドprint('Hello, world!')を入れて shiftreturn- 適当に保存してブラウザを閉じる
- ターミナルに戻って ctrlc で終了
キーボードショートカット
| key | action |
|---|---|
| esc | enter command mode |
| enter | enter edit mode |
| h | show keyboard shortcuts |
| y | to code |
| m | to markdown |
| a | insert cell above |
| b | insert cell bellow |
| dd | delete selected cells |
| ctrlreturn | run selected cells |
出力
例えばある Pandas DataFrame df を表示したいとき、
単に df で評価するのと明示的に print(df) を実行するのとでは結果が異なる。
前者はコードセルの出力として扱われ、HTML+CSSで描画される。
後者は副作用扱いで出力番号も与えられず、普通のテキストで表示される。
テキストで出力するオプションが欲しいけど見つからない。
nbconvert による変換時は
~/.jupyter/jupyter_nbconvert_config.py
に以下のように書いておけば print() 無しでもテキスト表示できる。
c.NbConvertBase.display_data_priority = ['text/plain']
Jupyter’s Common Configuration Approach
によれば代入ではなく .prepend() でも行けそうだが、
それだとなぜか text/html が優先されてしまう。
また、いくつもある display_data_priority の中でなぜ
NbConvertBase だけが効くのか、というのもよく分からない。
Jupytext
https://jupytext.readthedocs.io/
.ipynb, .py, .md などの形式を相互に変換してくれる。
例えば、手元のソースコードは .py としてバージョン管理・編集し、
配布時に .ipynb で出力といった使い方ができる。
Jupytextではソースコードを同期することが主眼なので、
knitr
のようにコードセルの実行結果を含むMarkdownを書き出す機能は無い。
それは
jupyter nbconvert --execute --to markdown
とかでやるべき仕事っぽい。
jupytext/issues/220
で議論はある。
Format
md(Jupytext Markdown)- YAMLヘッダーにメタデータを保存する。
- コードセルにオプションを付けられる。
- それ以外はほぼ普通のMarkdown。
- 現状のVSCodeではコードセル内での補完が貧弱なのは残念だが、 リポート目的で非コードが多いならこれが扱いやすそう。
rmarkdown(R Markdown)- コードセルに波括弧を付ける:
{python} - Rから knitr を使えば結果を含むMarkdownを出力できる。 RとPythonの橋渡しはreticulateが担う。
md:myst(MyST Markdown; Markedly Structured Text)- CommonMarkに準拠しつつreStructuredTextやSphinxの機能をサポートするリッチなMarkdown。
- コードセルの中にメタデータを埋め込むのが難点。
md:pandoc(Pandoc Markdown)- Pandoc divs
:::という謎要素でセルを区切るらしい。 py:light# コメントのかたまりをテキストセルとして扱う- コードと隣接するコメントはコードセル内に含められる。
py:percent- セルの頭に明示的に
# %%を書く。 - VSCode CodeLens でも認識されるが、むしろ表示が邪魔なのでオフにする。
- 現状のVSCodeでコードを書くにはこれが一番扱いやすいか。
py:nomarker- 情報が落ちすぎて round-trip 不可。