Heavy Watal

IPython — 強力な対話型Python実行環境

対話型実行環境

起動

ターミナルから ipython を実行するか、 普通の対話Pythonから:

import IPython
IPython.start_ipython(argv=[])

とりあえずドキュメントを読む:

?
%quickref

文脈を考慮したタブ補完

定義済み変数などはある程度 rlcompleter でも補完できるが、 IPythonはさらに文脈を考慮して賢い補完をしてくれる:

import o[TAB]
import os.[TAB]
open('~/.[TAB]')

履歴

Object introspection

関数がどんな引数をとるか、 クラスがどんなメンバを持っているか、 などをパッと覗くことができる。 help() コマンドの強力版。

先頭(か末尾)にクエスチョンをつけるだけ:

?os
??os

システムコマンド実行

頭にエクスクラメーションをつけるだけ:

!pwd
files = !ls

マジックコマンド

環境設定

ipython help profile
ipython profile create [name]
ipython profile list
ipython profile locate
ipython --profile=<name>

~/.ipython/profile_default/ipython_config.py

起動時に自動的に pandasmatplotlib を読み込むとか。 automagicを切るとか。

Jupyter

https://jupyter.org/

ウェブブラウザ上で動く対話的実行環境。 元はIPython Notebookだったが、 カーネルを入れ替えることで他言語を扱うことが可能になり、 汎用Jupyter Notebookとして生まれ変わった。 それをさらに開発環境として洗練させたのがJupyterLab

ノートブック形式 .ipynb は Markdown/LaTeX記法による見出し・コメント・数式とともに ソースコードと実行結果をひとまとめに保存しておけるので、 研究ノートのような使い方に向いている。 Mathematica/Mapleの使い勝手に似ている。 GitHub上でも直接閲覧できるし、VS CodeやAtomでも扱える。 ターミナルやテキストエディタに馴染みのない非プログラマ向けには便利だろう。

ファイルがインプット・アウトプット混在の複雑なテキストになるので、 コマンドラインやGit上での取り回しが悪いのは致命的な欠点。 後述のJupytextがこれを回避する救世主かもしれない。

始め方

  1. 適当な作業ディレクトリを作って移動: mkdir -p ~/jupyter; cd $_
  2. ターミナルから起動: jupyter lab [file or directory]
  3. ウェブブラウザで http://localhost:8888/lab/ が立ち上がる
  4. Launcher内のNotebookにある適当なカーネル (e.g., Python 3) を選択
  5. [ ]: の右の箱に適当なコマンド print('Hello, world!') を入れて shift-return
  6. 適当に保存してブラウザを閉じる
  7. ターミナルに戻って control-c で終了

キーボードショートカット

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
ctrl-return 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。
現状のVS Codeではコードセル内での補完が貧弱なのは残念だが、 リポート目的で非コードが多いならこれが扱いやすそう。
rmarkdown (R Markdown)
コードセルに波括弧を付ける: {python}
Rからknitrを使えば結果を含むMarkdownを出力できるが、 RとPythonの橋渡しをする reticulate パッケージがまだまだ開発途上という印象。
md:myst (MyST Markdown; Markedly Structured Text)
CommonMarkに準拠しつつreStrucutredTextやSphinxの機能をサポートするリッチなMarkdown。
コードセルの中にメタデータを埋め込むのが難点。
md:pandoc (Pandoc Markdown)
Pandoc divs ::: という謎要素でセルを区切るらしい。
py:light
# コメント のかたまりをテキストセルとして扱う
コードと隣接するコメントはコードセル内に含められる。
py:percent
セルの頭に明示的に # %% を書く。
VS Code CodeLens や Atom Hydrogen などでも認識されて特別扱いされるが、 むしろ表示が邪魔なのでオフにする。
現状のVS Codeでコードを書くにはこれが一番扱いやすいか。
py:nomarker
情報が落ちすぎて round-trip 不可。

Config

${XDG_CONFIG_HOME}/jupytext/jupytext.toml

書籍