非エンジニアでも使いやすい高機能なPython環境「IPython」「Jupyter」を使ってみよう

Pythonには任意のコードを対話的に実行できる環境が用意されているが、昨今ではこの機能を強化した「IPython」や、それらをグラフィカルに利用できる「Jupyter Notebook」といったツールが登場している。これらはWindowsなどのGUIベースの環境でも使いやすく、グラフや画像の描画、テキストのフォーマッティングなど、視覚化やレポート作成に便利な機能も備えている。今回はこのIPythonやJupyter Notebookについて紹介する。

強力な対話的環境を提供

Pythonでは、コマンドラインから引数無しに「python」コマンドを実行するとコマンドプロンプト(「>>>」)が表示される。これはREPL(Read-Eval-Print-Loop)や対話的実行環境などと呼ばれるもので、入力したコードをその場で実行し、その結果を出力するという動きをする。

たとえば次の例は、REPL内で「math」モジュールを読み込み、mathモジュールに含まれるsin()関数を実行したものだ。

$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.sin(10)
-0.5440211108893698

PythonのREPLでは過去の入力履歴を矢印キーで呼び出せるほか、ドキュメントを表示するhelp()関数も用意されている。これらは簡単なコードの実行やテストなどに便利なのだが、このREPLをさらに強化し、入力補完機能やさまざまな分析・支援機能を加えたものが今回紹介する「IPython」と「Jupyter Notebook」だ(図1)。

図1 IPythonをWebブラウザ上からGUIで操作できる「Jupyter Notebook」
図1 IPythonをWebブラウザ上からGUIで操作できる「Jupyter Notebook」

IPythonとJupyterの歴史とコンポーネント

IPythonは前述のとおり、Pythonの実行環境を強化するツールとして開発が始まったものなのだが、その後ほかのプログラミング言語にも対応できるよう改良が加えられ、その共通部分のコンポーネントを「Jupyter」、Jupyterを利用したコンソール上で動作するプログラム部分のみを「IPython」(「ipython」コマンド)と呼ぶようになった。

こういった背景から、後述する「Notebook」などの関連ツールも含めてIPythonと呼ぶドキュメントなども存在するが、現在ではIPythonはコマンドライン上で実行できる対話的実行環境のことのみを指すようになっているので注意したい。

IPythonやJupyterのインストール

前回、WindowsやmacOSでPython環境を整えるツールとして「Anaconda」を紹介したが、Anacondaをインストールするとデフォルトで次のようなJupyter関連のコンポーネントがインストールされる。

  • ipython(IPython):コマンドライン上で動作する対話的実行環境
  • qtconsole(Qt Console):qtで実装されたコンソール上で動作するJupyter環境。コードの対話的実行に加えてグラフの表示といった機能を備える
  • notebook(Jupyter Notebook):Webブラウザ上で動作する環境。コードの対話的実行やグラフ表示に加えて、画像などのメディアコンテンツの埋め込み表示や、これらコンテンツを実行するコードと一緒に保存する機能を備える
  • jupyterlab(JupyterLab):Jupyter Notebookをさらに拡張し、各種データ表示ツールなどを組み込んだもの

やや分かりにくいが、基本となる対話的実行環境がipyhonコマンド(IPython)として提供されており、さらにIPython向けに専用のコンソールを用意することでグラフ表示などを可能にするよう拡張したものがQt Console、テキストや画像などをまとめてノートのように扱えるようにしたものがJupyter Notebook、さらにJupyter Notebookの後継となるべく開発が進められているものがJupyterLabと捉えておけば良いだろう。ちなみにJupyterLabはまだベータ版という段階なので、今後仕様などが変わる可能性がある。

IPythonを利用したいがAnaconda環境は不要という場合は、Pythonのパッケージ管理ツールである「pip」からIPythonをインストールできる。

# pip install ipython

なお、現在リリースされている最新のIPython(バージョン6系)はPython 2系やPython 3.2未満がサポートされていない。そのため、こういった環境でIPythonを利用したい場合は次のようにバージョン5系の最新版であるバージョン5.8系をインストールするよう指定する。

# pip install ipython==5.8

そのほか、DebianやFedoraなどのLinuxディストリビューションでは標準パッケージとしてIPythonが提供されている。また、Red Hat Enterprise LinuxやCentOSなどのその互換環境では、追加パッケージリポジトリであるEPELでipythonパッケージが提供されている。

IPythonを使ってみよう

続いてはIPythonの実際の使い方について紹介していこう。IPythonの機能は後述するQt ConsoleやJupyter Notebook上でもすべて利用が可能だが、まずはコンソール(コマンドプロンプト)上での利用例をベースに機能を紹介していく。

IPythonシェルは、WindowsのコマンドプロンプトやLinux/macOSのターミナルから「ipython」コマンドを実行することで起動できる(図2)。

図2 Windowsのコマンドプロンプトから起動したIPython
図2 Windowsのコマンドプロンプトから起動したIPython

IPythonシェルはPythonのREPLと似ているが、REPLにはない複数の機能が利用できる。その1つが入力支援機能だ。たとえば、「math」モジュールをインポートした状態で「math.」と入力してTabキーを押すと、補完候補としてこのモジュールで利用できるメソッドやプロパティが表示される(図3)。

図3 IPythonでの入力補完機能利用例
図3 IPythonでの入力補完機能利用例

ここで再度Tabキーを押すことで補完候補を選択でき、その後Enterキーを押すことで選択したものを入力できる。この入力補完機能では、モジュール名や変数名だけでなくファイル名やディレクトリ名も補完対象となっている。

IPythonでは過去に入力したコードが記録されており、矢印キー(「↑」「↓」)で前に入力したコードを呼び出せる。さらに、入力は「In」、その実行結果は「Out」という変数(配列)に格納されており、この変数経由で過去に入力したコードやその結果を参照できるようになっている(図4)。これは過去に実行したコードの結果を確認・再利用したい場合に有用だ。

図4 「In」「Out」変数経由で過去のコードとその実行結果を参照できる
図4 「In」「Out」変数経由で過去のコードとその実行結果を参照できる

これに加えて、直近から3つ前までの出力結果を格納する「_」「__」「___」という変数も用意されている。

IPythonのもう1つの強力な機能として、オブジェクトの情報を表示する機能がある。モジュール名や変数名などの後に「?」を入力してEnterキーを押すと、そのモジュールや変数の情報が表示される(図5)。

図5 「?」で指定したオブジェクトの情報を確認できる
図5 「?」で指定したオブジェクトの情報を確認できる

たとえば変数に対してこの機能を実行した場合、その変数に格納されているオブジェクトの型や値の文字列表現、ドキュメントなどを表示できる(図6)。

図6 変数に格納されているオブジェクトの型や値などの情報も確認できる
図6 変数に格納されているオブジェクトの型や値などの情報も確認できる

また、モジュールや変数名などの後に「??」を入力してEnterキーを押すと、より詳細なドキュメントが表示される(図7)。

図7 「??」ではより詳しいドキュメントを確認できる
図7 「??」ではより詳しいドキュメントを確認できる

特別な機能を実行できる「Magic functions」

IPythonではこれらの機能に加えて、「%」で始まる特別なコマンドが利用できる。これらは「Magic functions」と呼ばれている。デフォルトで利用できるMagic functionsの一覧はドキュメントを確認して欲しいが、主なものとして表1のものが挙げられる。

表1 主要なMagic functionsの例
コマンド名 説明
%cd カレントディレクトリを変更する
%config IPythonの設定変数を変更する
%debug デバッガを起動する
%edit エディタを起動し、入力されたコードを実行する
%env 環境変数の参照/設定を行う
%history 入力履歴にアクセスする
%load 指定したファイルを読み込んでIPython上で実行する
%logstart 指定したファイルに実行したコードや実行結果をログとして記録する
%matplotlib matplotlibサポートを有効にする
%notebook 履歴をnotebook形式でエクスポートする
%pastebin 履歴を外部サービスにアップロードする
%prun プロファイラを使った分析付きでコードを実行する
%pwd カレントディレクトリを表示する
%recall 過去に実行したコマンドを再実行する
%reset ロードしたモジュールや定義した変数、履歴などをすべてリセットする
%run 指定したファイルをIPython環境内で実行する
%save 実行履歴を指定したファイルに保存する
%sx シェルコマンドを実行してその結果を出力する
%tb 直近のトレースバック出力を表示する
%time コードを実行してその所要時間を測定する
%who、%who_ls、%whos 定義済みの変数やモジュールなどの一覧を表示する
%xdel 指定した変数を削除する

これらを利用することでIPythonの挙動を変更できるほか、さまざまなサポート機能を利用できる。

たとえば、ファイルに記述したコードをIPython上にロードして実行するには、「%load」コマンドを利用できる(図8)。

図8 IPythonの「%load」コマンドではファイルからコードをロードして実行できる
図8 IPythonの「%load」コマンドではファイルからコードをロードして実行できる

ファイル名を引数として%loadコマンドを実行すると、ファイルの内容が「:」に続いて表示される。ここでは簡易的な編集機能が利用でき、この内容をIPython上で編集してから実行することも可能だ。

単純にファイルに保存されたPythonコードを実行するだけなら、「%run」コマンドを利用すればよい。%runコマンドは%loadコマンドと同様に引数で指定したファイルを実行するものだが、コマンドを実行すると即座に指定したファイルが実行され、その結果が出力される(図9)。

図9 IPythonの「%run」コマンドは指定したファイルを実行する
図9 IPythonの「%run」コマンドは指定したファイルを実行する

また、「%prun」コマンドではプロファイラによるコードの分析が行える。%prunコマンドでは続けて指定したコードを実行して分析するが、%runコマンドと組み合わせることでファイルに保存したコードに対しプロファイリングを実行することも可能だ(図10)。

図10 「%prun %run <ファイル名>」のようにすることでプロファイリングを実行できる
図10 「%prun %run <ファイル名>」のようにすることでプロファイリングを実行できる

ちなみに、「%%prun」のようにMagic commandの最初の「%」を2つ付けると、「cell mode」と呼ばれる複数行の入力が可能なモードとなり、ここで入力したコードをプロファイリングできる(図11)。

図11 「%%prun」のように「%」を2つ続けると複数行のコードが入力可能になる
図11 「%%prun」のように「%」を2つ続けると複数行のコードが入力可能になる

そのほか、IPythonシェルでは%cdコマンドでカレントディレクトリを変更したり、「!<コマンド名>」や「!!<コマンド名>」で任意のシェルコマンドを実行したりすることもできる。なお、「!!」は実行結果を履歴(Out変数)に格納するが、「!」は格納しないという違いがある(図12)。

図12 「!」や「!!」で任意のシェルコマンドを実行できる。「!!」の場合、出力がOut変数に格納される
図12 「!」や「!!」で任意のシェルコマンドを実行できる。「!!」の場合、出力がOut変数に格納される

リッチ出力とQt Console

AnacondaでPython環境をインストールした場合、前述の通りQt Consoleという独自のコンソール上でIPythonシェルを実行できる環境が提供される。Qt Consoleではマウスによる文字選択やコピー&ペーストが行えるほか、タブで複数のIPythonシェルを同時に実行することが可能になっている(図13)。

図13 Qt Consoleでは複数のタブで同時にIPythonシェルを実行できる
図13 Qt Consoleでは複数のタブで同時にIPythonシェルを実行できる

Windows環境のコマンドプロンプトはコピー&ペースト操作に制約があるほか、ウィンドウサイズの変更が面倒といった問題があるが、Qt Consoleを利用することでこういった問題を解決できる。

さらに、Qt Console上では入力時に自動的にドキュメントが表示されるなど、IPythonシェル自体の使い勝手も向上する(図14)。

図14 Qt Consoleでは入力中のメソッドなどのドキュメントを自動的にポップアップで表示する機能がある
図14 Qt Consoleでは入力中のメソッドなどのドキュメントを自動的にポップアップで表示する機能がある

さらに、「matplotlib」というPython向けのプロット(グラフ描画)ライブラリとの連携も図られており、プロット結果をウィンドウ内に描画することが可能だ。

この機能を利用するには、あらかじめ「%matplotlib」コマンドを実行してmatplotlibサポートを有効にしておく。ちなみに、%matplotlibコマンドは引数でプロット先を指定できるようになっており、「inline」を指定するとウィンドウ内で描画が行われる。たとえば図15は、「x*x - 10*x + 15」という二次関数のグラフを描画させたものだ。

図15 Qt Console上で%matplotlibコマンドを「inline」オプション付きで実行することで、ウィンドウ内にプロット結果が表示されるようになる
図15 Qt Console上で%matplotlibコマンドを「inline」オプション付きで実行することで、ウィンドウ内にプロット結果が表示されるようになる

matplotlibはQt Console以外の環境でも利用可能だ。たとえばコマンドプロンプト上で実行しているIPythonでプロットを実行するメソッドを実行すると、別ウィンドウでその結果が表示される(図16、17

図16 matplotlibサポートを有効にした状態でmatplotlibに含まれるplotメソッドを実行した例
図16 matplotlibサポートを有効にした状態でmatplotlibに含まれるplotメソッドを実行した例
図17 コマンドプロンプトなどでIPythonを実行している場合、別ウィンドウでプロット結果が表示される
図17 コマンドプロンプトなどでIPythonを実行している場合、別ウィンドウでプロット結果が表示される

コードをドキュメントなどと一緒にまとめて保存できるJupyter Notebook

続いて、最近プログラマ以外にも利用が広まっているツールである「Jupyter Notebook」と呼ばれる、Webブラウザ上で動作するインタラクティブなPython実行環境について紹介しよう。Jupyter Notebookでは次の図18のような、Pythonコードや書式付きテキストを1つのファイル内にまとめた「Notebook」と呼ばれるドキュメントの作成が行える。

図18 Jupyter Notebookで作成できるドキュメントの例
図18 Jupyter Notebookで作成できるドキュメントの例

Jupyter Notebookの基本的な使い方

Jupyter Notebookを起動すると、Webブラウザ上でファイルブラウザが表示され、ここからNotebookファイルを指定して開いたり、新規作成が行える(図19)。

図19 Jupyterのファイルブラウザ画面
図19 Jupyterのファイルブラウザ画面

新規にNotebookを作成するには「New」をクリックし、作成する環境、もしくはファイルの種類を選択する(図20)。

図20 「New」から新規Notebookの作成が行える
図20 「New」から新規Notebookの作成が行える

Notebookを新規作成すると、次のようにメニューバーやツールバー、入力ボックスなどを含む画面が表示される。この入力ボックスは「Cell」と呼ばれており、デフォルトではここにコードを入力してCtrl+Enterを入力するとコードの実行結果が出力される(図21)。

図21 Jupyter Notebookでは表示された枠内にコードを入力して実行できる
図21 Jupyter Notebookでは表示された枠内にコードを入力して実行できる

Cellの内容は実行後でも編集が可能だ。また、複数行の入力が可能で、その場合最後の命令の戻り値が出力される(図22)。

図22 Cell内には複数の命令を記述することもできる
図22 Cell内には複数の命令を記述することもできる

複数の命令の実行結果を別々に出力したい場合、ツールバーの「+」ボタンをクリックすれば新たなCellが追加されるので、そこに別の命令を記述すれば良い(図23)。

図23 「+」ボタンをクリックすることでCellを追加できる
図23 「+」ボタンをクリックすることでCellを追加できる

Cellの順序はツールバーの「↑」「↓」ボタンで並び替えることが可能だ。さらに、Cell内にはコードだけでなく、Markdown形式の書式付きテキストも入力できる。Cellを選択し、ツールバーのドロップダウンメニューで「Markdown」を選択するとMarkdownテキストを入力できるようになる(図24)。

図24 ドロップダウンで「Markdown」を選択するとCellに書式付きテキストを入力できる
図24 ドロップダウンで「Markdown」を選択するとCellに書式付きテキストを入力できる

書式として「Markdown」を選択したCellを選択した状態で「Edit」メニューの「Insert Image」を選択すると、ファイルを選択するダイアログが表示され、ここでファイルを指定することでCell内に画像を挿入できる(図25)。

図25 「Edit」-「Insert Image」でCell内に画像を挿入できる
図25 「Edit」-「Insert Image」でCell内に画像を挿入できる

なお、この操作を行うと画像がbase64エンコードされてHTML内に埋め込まれ、さらにその画像を埋め込むMarkdownを生成するという処理が行われる。そのため、画像の前後にテキストを入れることも可能だ(図26)。

図26 画像を表示するMarkdownコードが生成されている
図26 画像を表示するMarkdownコードが生成されている

もちろん、画像や見出し以外のMarkdown記法もサポートされている。次の例は、表を記述した例だ(図27、28)。

図27 Markdownで表を記述した例
図27 Markdownで表を記述した例
図28 表のレンダリング結果
図28 表のレンダリング結果

書式としてMarkdownを選択した場合、MathMLやTeX/LaTeX風の書式で数式を記述することもできる。この機能は「MathJax」というライブラリを使って実現しているという(図29、30)。

図29 Cell内にLaTexの形式で数式を記述する
図29 Cell内にLaTexの形式で数式を記述する
図30 記述した数式は自動的にレンダリングされて表示される
図30 記述した数式は自動的にレンダリングされて表示される

キーボードショートカットを使う

Cellの作成や書式の変更はツールバーの操作で行えるが、入力中にいちいちマウスで操作を行うのは面倒だ。そのため、Jupyter Notebookではこれらの操作を実行できるキーボードショートカットも用意されている。ショートカット一覧はメニューバーの「Help」-「Keyboard shortcuts」で確認できるので詳しくはこちらを見て欲しいが、画面上やテキスト編集中にEscキーを押すと「Command Mode」となり、たとえばこの状態で「A」を押すと選択中のCellの上に新しいCellが追加される。また、Command Modeで「M」を押すと選択中のCellの書式をMarkdown形式に切り替えることができる(表2)。

表2 Command Modeでのキーボードショートカット(抜粋)
キー 説明
Enter 編集モードに戻る
Y Cellの書式をコードに変更する
M Cellの書式をMarkdownに変更する
R Cellの書式をRaw形式に変更する
A 選択中のCellの上に新たなCellを挿入する
B 選択中のCellの下に新たなCellを挿入する
X 選択中のCellをカットする
C 選択中のCellをコピーする
V 選択中のCellの下にCellをペーストする
Shift+V 選択中のCellの上にCellをペーストする

Notebook内にPythonコードの実行結果をグラフィカルに表示させる

Jupyter Notebookでは、Pythonコードの実行結果をグラフィカルに表示する機能も用意されており、これが非常に強力だ。たとえば、先に説明した%matplotlibマジックコマンドでmatplotlibサポートを有効にすれば、plot()メソッドの実行結果をNotebook内に表示できる(図31)。

図31 matplotlibを使ってNotebook内にグラフを表示する例
図31 matplotlibを使ってNotebook内にグラフを表示する例

データ分析ツールとしてよく使われている「Pandas(Python Data Analysis Library)」の「DataFrame」オブジェクトをNotebook上で評価すると、表として整形されて出力される(図32)。

図32 PandasのDataFrameオブジェクトはNotebook上で表として表示できる
図32 PandasのDataFrameオブジェクトはNotebook上で表として表示できる

また、数式処理ライブラリであるSymPyでは、Notebook内で「init_printing()」メソッドを実行することで数式を整形された形で出力できる(図33)。

図33 SymPyで扱う数式も整形して表示が可能だ
図33 SymPyで扱う数式も整形して表示が可能だ

そのほか、IPython.displayモジュールを使えば音声や動画などをNotebook内に埋め込むこともできる(図34)。詳しくはこのモジュールのドキュメントを参照して欲しいが、IPython.display.Audio()は指定した音声ファイルを、IPython.display.YouTubeVideo()は指定したYouTube動画をNotebook内に埋め込んで表示/再生可能にするものだ。

図34 IPython.displayモジュールではさまざまなデータを表示できる
図34 IPython.displayモジュールではさまざまなデータを表示できる

Notebookで利用するPythonのバージョンを切り替える

前回説明したように、Anaconda経由でNotebookなどをインストールした場合、環境を作成して切り替えることで異なるバージョンのPythonを使い分けることができた。ただ、前回説明した方法ではNotebookなどの起動時に使用するバージョンを切り替える必要があった。いっぽう、Notebookでは起動後でも使用するPythonのバージョンを切り替える仕組みが用意されている。この機能を利用するには、Anacondaで作成した各環境で「ipykernel」および「nb_conda_kernels」パッケージをインストールすれば良い(図35)。

図35 Anacondaで各環境ごとに「ipykernel」と「nb_conda_kernels」をインストールしておく
図35 Anacondaで各環境ごとに「ipykernel」と「nb_conda_kernels」をインストールしておく

すると、Notebookの新規作成時に使用するPython環境を選択できるようになる(図26

図36 Notebookの新規作成時にPython環境を選択できる
図36 Notebookの新規作成時にPython環境を選択できる

一度慣れると手放せない使い勝手のIPython

今回はIPythonおよびそれを利用するQt ConsoleやJupyter Notebookについて紹介した。Pythonの利用にGUIは不要と考えている人もいるかもしれないが、その場合でもIPythonの補完機能やドキュメント機能、開発支援機能などは非常に便利であり、REPLの代替として一度使い始めると手放せない使い勝手がある。

また、Jupyter Notebookでは作成したNotebookをPDF形式やHTML形式、Markdown形式など、さまざまな形式でエクスポートできるようになっている。そのため、ドキュメントの作成などに非常に有用だ。もちろん、Windows環境などでPythonや各種モジュールの挙動を調べたりするといった用途にも便利である。NumPyやSymPyといったツールと組み合わせれば、MathematicaやMatlabのように利用することも可能だ。Pythonを研究・開発目的で利用しているのであれば、ぜひ試してみると良いだろう。