IPython の豊富な機能を使いこなす (2)

以前に [IPython の豊富な機能を使いこなす](http://qiita.com/ynakayama/items/a159544f9d4c83d52cee)ための説明や [IPython Notebook の使いどころ](http://qiita.com/ynakayama/items/72d744554f0454139c0f)、 [IPython notebook サーバーを立ち上げる](http://qiita.com/ynakayama/items/ab3ea36fa8a7f0f6e5b3)方法を書きました。

今回はその続きで、プロファイルの切り替えやプロンプトのカスタマイズ、対話的デバッガ (pdb) の利用について書きます。特に対話的デバッガは重要でこれを使いこなせるようになると開発生産性がぐっと高まります。

## プロファイルの切り替え

デフォルトのプロファイルは次のコマンドで生成できます。

```bash
ipython profile create default
```

こうするとホームディレクトリとして設定された場所に .ipython/profile_default のようなディレクトリが作成されます。この default の部分がプロファイルの名称になります。

プロファイルでは主に次のような項目を設定できます。

* プロンプトや出力の色の設定
* 起動時の Python コードの実行
* マジックコマンド、システムエイリアス
* 拡張機能を有効にするかどうか

IPython の起動時に ipython --profile=default などとオプションを指定することでプロファイル名を指定することができます。プロファイルの詳細については[ドキュメント](http://ipython.org/ipython-doc/2/config/intro.html#profiles)に記載があります。

## プロンプトのカスタマイズ

profile_default/ipython_config.py には IPython シェルプロンプトの全体的な設定が定義されます。このファイルについては [IPython のドキュメント](http://ipython.org/ipython-doc/2/development/config.html#python-configuration-files)に詳しい説明が掲載されています。

このファイルではまず最初に c = get_config() としてインスタンスが生成され、このインスタンスの値を設定することで環境設定がおこなわれます。たとえば筆者の環境ではプロンプトを次のようにしています。

```py3
c.PromptManager.out_template = r'[\#]: '
c.PromptManager.in2_template = r'{color.Green}[{color.LightGreen}\D{color.Green}]: '
c.PromptManager.in_template = r'{color.Yellow}\h{color.LightBlue}[{color.LightCyan}\T{color.LightBlue}]{color.Green}[{color.LightGreen}\#{color.Green}]: '
```

out は出力行、 in2 は継続行、 in は入力行を定義します。

![0.png](https://qiita-image-store.s3.amazonaws.com/0/38501/09e9b7bb-8b77-093c-e7b9-dcd3f68de08f.png)

なお、設定ファイルでは c インスタンスで操作しますが、シェルから環境を操作するには %config マジックコマンドを利用します。

プロンプトの拡張についても[ドキュメント](http://ipython.org/ipython-doc/2/interactive/shell.html#prompt-customization)が参考になります。

なお上の例では[以前に書いた](http://qiita.com/ynakayama/items/a159544f9d4c83d52cee)通り初期化スクリプトでいくつかのライブラリをインポートしています。

## マジックコマンドとシェルコマンド

% で始まるコマンドをマジックコマンドと言います。 % だけ打ってタブを入力すると IPython のタブ補完機能により一覧が表示されます。たとえば %pwd とするとカレントディレクトリが表示されます。 %who とすると有効なインスタンスの名前空間が表示されます。

```py
hoge = "fuga"
%who
#=> hoge
```

また ! で始まるコマンドはシェルコマンドとしてシェルにそのまま渡されます。

## 対話的デバッガ

IPython では [pdb デバッガ](http://docs.python.jp/3.4/library/pdb.html)の拡張を利用することができます。 %debug コマンドは直前に発生した例外のデバッグをします。 %pdb コマンドで例外発生時に自動的にデバッガを起動するように設定できます。

IPython の[ドキュメント](http://ipython.org/ipython-doc/2/interactive/reference.html#using-the-python-debugger-pdb)にも pdb の使い方について書かれています。

次のように set_trace() および debug() 関数を定義しておくと、開発中のコードの任意の位置に set_trace() を書くことでそこで実行を停止しデバッガを起動することができます。

```py3
def set_trace():
    from IPython.core.debugger import Pdb
    Pdb(color_scheme='Linux').set_trace(sys._getframe().f_back)

def debug(f, *args, **kwargs):
    from IPython.core.debugger import Pdb
    pdb = Pdb(color_scheme='Linux')
    return pdb.runcall(f, *args, **kwargs)
```

また debug() 関数で、任意の関数に対して対話的デバッガが起動できます。たとえば下の例では f という関数に対して対話的デバッガを起動しています。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/fb933ac2-3c3b-5f8d-b32c-f53cf96a6e69.png)

たとえばこの状態で a を押すと現在の関数の引数の一覧が、 w を押すと現在位置でのスタックトレースの表示が、 s を押すとステップインが、 u/d で関数呼び出しスタックの上げ下げができます。変数を表示したり、任意の操作を加えたりといったこともできます。

## まとめ

このような対話的環境は非常に便利で生産性が高いので、一度 IPython での開発を身に付けるとこれ無しには開発ができないほど手放せないものとなります。 IPython と好みのエディタだけあれば Python での開発には十分と言っても過言ではありません。

## 参考

Pythonによるデータ分析入門
http://www.oreilly.co.jp/books/9784873116556/