IPythonをインストールして使ってみる

強力なPythonシェル(REPL)のIPythonをインストールして試した事を説明しています。IPythonには強力なコード補完機能、マジックコマンド(マジック関数)などがあり、システム(bashなどのシェル)コマンドの実行もできます。

目的と動作環境

最終更新日:2021/11/4

IPythonは、対話形式(REPL)でpythonのコードを実行できます。標準のPythonにもREPL(Pythonシェル)は付いていますが、IPythonは標準のPythonのREPLよりも強力で便利な機能が付いているので、pythonコードを試すのにはメリットが大きい実行環境です。

REPLはRead-Eval-Print Loopの略称で、対話形式でpythonなどのコードを実行して評価して結果を出力してくれます。

ここでは、IPythonをインストールして、実際にIPythonを試しながら便利な機能を説明していきます。

■動作環境とバージョン情報です。
OS:macOS Big Sur(バージョン11.4)
Pythonバージョン:3.9.0
インストールしたIPython:7.25.0

$ python -V
Python 3.9.0

pipでIPythonをインストールする

まずはIPythonをインストールします。ここではpipを使ってインストールしていきます。
現状、私の環境のpipのパッケージ一覧です。

$ pip list
Package    Version
---------- -------
pip        21.1.3
setuptools 49.2.1

それでは、IPythonをインストールします。

$ pip install ipython
Collecting ipython
  Using cached ipython-7.25.0-py3-none-any.whl (786 kB)
〜
Successfully installed appnope-0.1.2 backcall-0.2.0 decorator-5.0.9 ipython-7.25.0 ipython-genutils-0.2.0 jedi-0.18.0 matplotlib-inline-0.1.2 parso-0.8.2 pexpect-4.8.0 pickleshare-0.7.5 prompt-toolkit-3.0.19 ptyprocess-0.7.0 pygments-2.9.0 traitlets-5.0.5 wcwidth-0.2.5

$ pip list
Package           Version
----------------- -------
appnope           0.1.2
backcall          0.2.0
decorator         5.0.9
ipython           7.25.0
ipython-genutils  0.2.0
jedi              0.18.0
matplotlib-inline 0.1.2
parso             0.8.2
pexpect           4.8.0
pickleshare       0.7.5
pip               21.1.3
prompt-toolkit    3.0.19
ptyprocess        0.7.0
Pygments          2.9.0
setuptools        49.2.1
traitlets         5.0.5
wcwidth           0.2.5
ipythonをインストールできました!バージョンは7.25.0です。ipythonに依存するパッケージも色々とインストールされました。

実際にIPythonを使ってみる。起動と終了。

IPythonをインストールできたので、早速使ってみます。
IPythonはipythonコマンドで起動できます(IPythonのREPLが起動して、"In [n]"というプロンプトが表示される)。

$ ipython
Python 3.9.0 (default, Jan  9 2021, 22:05:52) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.25.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: 
簡単なpythonコードを実行してみます。
In [1]: print("hello,world")
hello,world

In [2]: 3 ** 3
Out[2]: 27
IPythonを終了したい場合、exitかquitです。
In [3]: exit
$ 

ちょっと見た感じでは、標準のpythonのREPLと比較すると、プロンプトが違うのと色付き(上のコマンド実行例だとすべて白にしちゃっていますが)ですね。

IPythonは、標準のpythonシェル(REPL)を強化した物という事なので、そのあたりをもう少し使いながら見ていきたいと思います。

IPythonの便利で強力な入力補完(コード補完)機能

まず、IPythonは入力補完(コード補完)機能が非常に便利です。
"im"と入力してタブキーを入力すると、入力補完で"import"となります。
そして、そのあとに例えば"t"と入力してタブキーを入力すると、"t"で始まるパッケージ(モジュール)の候補が表示されます。
IPythonの入力補完(コード補完)

さらに続けて"i"と入力してタブキーを入力すると、入力補完で"time"となり、"time"で始まるパッケージの候補に絞られます。

このままtimeモジュールをインポートして、timeモジュールを使ってみます。

In [1]: import time;

In [2]: 
"ti"と入力してタブキーを入力すると、"ti"で始まる候補が表示されるので、timeモジュールを選択します。
さらにtimeモジュールの定数やメソッド(関数)を呼び出すために、".(ドット)"を入力してタブキーを入力すると、timeモジュールの定数やメソッドの候補が表示されます。

こんな感じで入力補完(コード補完)が使えて、楽にコードを書けるようになるので非常に便利です。
IPythonの入力補完は、モジュール、メソッド、変数、キーワード(定数)、また、標準シェルのコマンドやカレントディレクトリ内のファイルやディレクトリで機能します(IPythonではpythonコードだけでなく、標準シェルのコマンドなども使えます)。

標準のpythonシェル(REPL)にも入力補完機能は付いていますが、モジュールや標準シェルのコマンドの入力補完は無いですし、全体的にIPythonの入力補完の方が強力です。

IPython上で、システムコマンド(シェルのコマンド)を使う

上でも書きましたが、IPythonのREPL上では、標準シェル(bashなど)のコマンドを使う事ができます。
標準シェルのコマンドを使う時は、コマンド前に"!"を付けます。

In [1]: !ls -l
total 8
drwxr-xr-x  19 username  staff  608  7  2 02:30 bin
drwxr-xr-x   2 username  staff   64  7  2 02:27 include
drwxr-xr-x   3 username  staff   96  7  2 02:27 lib
-rw-r--r--   1 username  staff   98  7  2 02:27 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  2 02:30 share
コマンドによっては、"!"を付けなくても使えます。
In [2]: ls -l
total 8
drwxr-xr-x  19 username  staff  608  7  2 02:30 bin/
drwxr-xr-x   2 username  staff   64  7  2 02:27 include/
drwxr-xr-x   3 username  staff   96  7  2 02:27 lib/
-rw-r--r--   1 username  staff   98  7  2 02:27 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  2 02:30 share/
また、標準シェルのコマンドの結果をpythonの変数に代入して使う事もできます(この場合、コマンド前に"!"は必要です)。
In [3]: cdlist = !ls -l

In [4]: cdlist
Out[4]: 
['total 8',
 'drwxr-xr-x  19 username  staff  608  7  2 02:30 bin',
 'drwxr-xr-x   2 username  staff   64  7  2 02:27 include',
 'drwxr-xr-x   3 username  staff   96  7  2 02:27 lib',
 '-rw-r--r--   1 username  staff   98  7  2 02:27 pyvenv.cfg',
 'drwxr-xr-x   3 username  staff   96  7  2 02:30 share']

In [5]: type(cdlist)
Out[5]: IPython.utils.text.SList
コマンド結果を受け取った変数の型はSListですね。

こんな感じで、IPythonではpythonコードとシェルのコマンドを同時に使う事ができます。

IPythonではなく、標準のPythonシェル(REPL)上でシェルコマンドを実行したい場合、osモジュールやsubprocessモジュールを使うなどいくつかの方法があります。

それについては別ページで説明していますので、興味のある方は参考にしてください。
PythonのREPL上でシステムコマンドを実行する方法

IPythonのプロンプトは"In [n]:"、コマンドの実行結果は"Out[n]:"となっていますが、これは入力したコマンドは"In"、コマンドの実行結果は"Out"という変数に自動で格納されて、その変数をあとで自由に使用する事が可能です。

In [6]: In
Out[6]: 
['',
 "get_ipython().system('ls -l')",
 "get_ipython().run_line_magic('ls', '-l')",
 "cdlist = get_ipython().getoutput('ls -l')",
 'cdlist',
 'type(cdlist)',
 'In']

In [7]: Out
Out[7]: 
{4: ['total 8',
  'drwxr-xr-x  19 username  staff  608  7  2 02:30 bin',
  'drwxr-xr-x   2 username  staff   64  7  2 02:27 include',
  'drwxr-xr-x   3 username  staff   96  7  2 02:27 lib',
  '-rw-r--r--   1 username  staff   98  7  2 02:27 pyvenv.cfg',
  'drwxr-xr-x   3 username  staff   96  7  2 02:30 share'],
 5: IPython.utils.text.SList,
 6: ['',
  "get_ipython().system('ls -l')",
  "get_ipython().run_line_magic('ls', '-l')",
  "cdlist = get_ipython().getoutput('ls -l')",
  'cdlist',
  'type(cdlist)',
  'In',
  'Out']}
Inの型はlist、Outの型はdictですね。

In [8]: type(In)
Out[8]: list

In [9]: type(Out)
Out[9]: dict

[広告] Kindle Unlimitedなら対象の本が定額で読み放題
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!

IPythonのヘルプを見たり、オブジェクトや変数のヘルプや情報などを見る

次に、IPythonのヘルプなどについてです。まず、"?"でヘルプを開いて見る事ができます。

In [1]: ?
IPython -- An enhanced Interactive Python
=========================================

IPython offers a fully compatible replacement for the standard Python
〜
また、"%quickref"でクイックリファレンスが見れます。
In [2]: %quickref
IPython -- An enhanced Interactive Python - Quick Reference Card
================================================================

obj?, obj??      : Get help, or more help for object (also works as
                   ?obj, ??obj).
?foo.*abc*       : List names in 'foo' containing 'abc' in them.
%magic           : Information about IPython's 'magic' % functions.

Magic functions are prefixed by % or %%, and typically take their arguments
〜
クイックリファレンスは、IPythonで使えるコマンドが端的にまとまっているので便利です。

また、オブジェクトや変数の語尾に"?"を付けると、そのオブジェクトや変数の情報やヘルプを見る事ができます。

sysモジュールをインポートして、ヘルプを見てみます。

In [3]: import sys;

In [4]: sys?
Type:        module
String form: <module 'sys' (built-in)>
Docstring:  
This module provides access to some objects used or maintained by the
〜
今度は、list型の変数を作って、変数からヘルプや情報を見ます。
In [5]: var_list = [1,2,3]

In [6]: var_list?
Type:        list
String form: [1, 2, 3]
Length:      3
Docstring:  
Built-in mutable sequence.
〜

IPythonのマジックコマンド(マジック関数)を使ってみる

IPythonには、IPython独自で使えるマジックコマンド(マジック関数)もあります。
例えば、"%timeit"コマンドは、コードの実行時間を計測します(マジックコマンドの頭には、"%"を付けます。)。

In [1]: %timeit 3 ** 3
10.4 ns ± 0.238 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
"of 7 runs, 100000000 loops each"と書いてあるのは、100000000回のループ数とループ内で7回の実行数という意味です。

ループ数を指定したい場合は-nオプション、実行数を指定したい場合は-rオプションで指定できます。

In [2]: %timeit -n 1000000 -r 5 3 ** 3
11 ns ± 0.516 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

次に、"%load"コマンドは、pythonファイルを指定して読み込んで、ファイルの内容を出力して実行します。

In [3]: cat hello.py
print("hello world!")

In [4]: %load hello.py

In [5]: # %load hello.py
   ...: print("hello world!")
   ...: 
hello world!
"%run”コマンドも、pythonファイルを指定して読み込んで実行できます(ファイルの内容は出力しない)。
In [6]: %run hello.py
hello world!

次に、"%whos"コマンドは、IPython上で定義した変数やオブジェクトの一覧を表示して確認できます。

In [7]: a = 99

In [8]: b = "hoge"

In [9]: c = [1,2,3]

In [10]: d = (1,2,3)

In [11]: import math;

In [12]: import sys;

In [13]: %whos
Variable   Type      Data/Info
------------------------------
a          int       99
b          str       hoge
c          list      n=3
d          tuple     n=3
math       module    <module 'math' from '/Use<...>th.cpython-39-darwin.so'>
sys        module    <module 'sys' (built-in)>

マジックコマンド(マジック関数)の一覧は、"%lsmagic"コマンドで確認する事ができます。

In [14]: %lsmagic
Out[14]: 
Available line magics:
%alias  %alias_magic  %autoawait  %autocall  %autoindent  %automagic  %bookmark  %cat  %cd  %clear  %colors  %conda  %config  %cp  %cpaste  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %paste  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.