keisukeのブログ

***乱雑です!自分用のメモです!*** 統計や機械学習の勉強と、読み物を書く練習と、備忘録用のブログ

IPython notebook (Jupyter) と IPython qtconsole を同じIPythonのカーネルで動かす

2015-05-23追記:
IPython Notebook version 3 (Jupyter)からは、どうやらカスタムjavascriptが変わったようですので、%username%\.ipython\profile_default\static\customにある、custom.jsの末尾に挿入するコードは次のようになります:

require([
     'base/js/namespace',
     'base/js/events'
 ], function(IPython, events) {
     events.on('app_initialized.NotebookApp', function(){
         IPython.toolbar.add_buttons_group([
             {
                 'label'   : 'run qtconsole',
                 'icon'    : 'fa-terminal fa', // select your icon from http://fortawesome.github.io/Font-Awesome/icons
                 'callback': function () {
                     IPython.notebook.kernel.execute('qtconsole')
                 }
             }
             // add more button here if needed.
             ]);
     });
     events.on('app_initialized.NotebookApp', function() {
        IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false;
     });
 });

+追記終わり+

2015/03/11追記:
ipython notebookが立ち上がった時に読むjavascriptを編集することで、簡単にqtconsoleを同じカーネルで動かすことが出来ます。 具体的には、
%username%\.ipython\profile_default\static\customにある、custom.jsというファイルの末尾に次を挿入:

$([IPython.events]).on('app_initialized.NotebookApp', function(){
    IPython.toolbar.add_buttons_group([
        {
             'label'   : 'run qtconsole',
             'icon'    : 'icon-terminal', // select your icon from http://fortawesome.github.io/Font-Awesome/icons
             'callback': function () {
                 IPython.notebook.kernel.execute('%qtconsole')
             }
        }
        // add more button here if needed.
        ]);
});

これだけです。 ただし、%username%\.ipython\profile_default\static\customの場所は異なる場合があります。デフォルトでなにもいじっていないなら問題無いと思います。

上記の設定をしたあとにいつも通りipython notebookを起動すれば、画面上部のツールバーに「>_」というアイコンが増えているはずです。 そのボタンを押せば、同じカーネルでqtconsoleが立ち上がり、notebookを汚さずに変数の中身やヘルプのチェックがおこなえます。f:id:kaisk:20150311221620p:plain

ちなみに、設定をいっさいしなくても、notebookに%qtconsoleと打ち込んで実行すれば同じカーネルでqtconsoleが立ち上がります。

+追記終わり+


IPython notebook はとても便利なアプリで,ブラウザ上でインタラクティブPythonのシェルを叩けます. しかし,基本的にはコードのブロックを次々と入力していき,しかも出力や入力のログが残り続けます. 「この変数はなんだっけ?」と思ってprint(x)などとだけ書いたコードを評価すると,そのprint(x)とその出力のログは残り続けるのです(というか,入力と出力のログを残すことがnotebookの役割なので正しいわけですが).

しかし,やっぱり変数の中身だけちょっと見てみたいとか,「これで決定!」なわけではないコードを試してみたいとか,とにかく「ログに残ってほしくない」ようなとき,shellで動くIPythonの便利さが欲しくなります. だからといって新たにshellでIPythonを起動しても,notebook上の変数を調べるためにはnotebookの入力を全部取ってきてshellにコピペしなければなりません.

そこで,同じカーネルでnotebookとqtconsole*1を動かすことを考えます. notebookもqtconsoleも,実はそれ自体はpythonのコードを実行してはいません.裏で動いている「カーネル」と呼ばれるpythonのプロセスに入力を渡して実行してもらい,その出力を受け取って表示しているだけです.よって,その「カーネル」を共有してnotebookとqtconsoleで使えば良いわけです.

まずはipython notebookを起動しましょう.ファイル名を指定して実行,またはshell(terminal, cmd.exe, powershellなど)上で

ipython notebook

とします. おなじみの画面がブラウザに表示され,同時にカーネル用のウィンドウ(シェルのウィンドウ)が立ち上がると思います. なにかnotebookを開いて,カーネルを起動させます. notebookを開くと,先ほどのシェルのウィンドウに「Kernel started: ***」のように表示されます.この状態で,今までどおりnotebookは編集できます. さらに同じカーネルを使ったqtconsoleを立ち上げるには,ファイル名を指定して実行,またはshell上で

ipython qtconsole --existing

とします. --existingオプションは,ipythonを最後に起動したカーネルを使って立ち上げるという意味です. もしもすでにカーネル複数立ち上がっていて(=複数のnotebookを編集していて),どのカーネルを使ってqtconsoleをたちあげたいか指定するときには,使いたいカーネルのウィンドウに表示されている「Kernal started:」のあとの文字列と同じものを使って

ipython qtconsole --existing kernel-文字列.json

とします. もしもカーネルの番号がわからなくなった場合,notebookで

%connect_info

を実行すれば教えてくれます."key"がそうです.

*1:shell上のipythonみたいなものです.shellよりちょっと強力な機能がついています.