IPython
python3

ipython を起動しながら自作モジュールを修正した場合

More than 1 year has passed since last update.

目的

ipython起動中に、自作モジュールの修正をしても反映されないので、この問題を回避する策を提示すること

メイン

本家 の翻訳のようになってしまうがお許しください。

以下の順番で進みます
- %autorelaod 2
- %autoreload 1
- %autoreload

%autorelaod 2

簡単のため本家そのまま引用する

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
  1. 外部のモジュールautoreloadをロード
  2. autoreload 2を実行
  3. some_functionをインポートする
  4. 実行(42を返す)
  5. ここで、some_function()を43を返すように修正
  6. 実行(43を返す)

autoreload 2は、実行する度にautoreload 2より以前にインポートしたモジュールをリロードする。ここではsome_functionを毎回リロードしてくれる。

%autoreload 1

In [1]: %load_ext autoreload

In [2]: %aimport foo

In [3]: %autoreload 1

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43

autoreload 1%aimport [module]したモジュールを実行する度にリロードしてくれる。

%autoreload

In [2]: %load_ext autoreload

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: %autoreload

In [7]: some_function()
Out[7]: 43

In [8]:# open foo.py in an editor and change some_function to return 42

In [9]: some_function()
out[9]: 43

%autoreload%autoreloadが実行される度にインポートしたモジュールをリロードする。%autoreloadしなければ、リロードはされない

まとめ

コマンド 特徴 用途
autoreload 2 実行する度にモジュールを自動でリロードする すべてのモジュールをいつでもリロードしたいとき
autoreload 1 %aimportで指定したものを実行する度に自動インポート  選択的にモジュールを自動リロードしたい時
autoreload このコマンドを実行するとモジュールが自動リロード 自動リロードするタイミングを指定したい時

といったところでしょうか。結構ハマりました。しかもバージョンが上がって、過去のものは使えなくなったりしていました。reloadとか。。。

これでipythonのモジュール修正が反映されない問題が解決できました。更に楽しいipythonライフを!

先人の投稿

http://qiita.com/ksomemo/items/74607f4dd3222fe9273d